CAB TA 4기 23일차의 기록

Urban Jungle·2025년 4월 15일

CAB TA 4기

목록 보기
23/28
post-thumbnail

SSL Certificate and HTTPS Setup

본 프로젝트에서는 웹 서비스의 기본 보안을 강화하기 위해 Let's Encrypt 인증서와 Apache의 mod_ssl 모듈을 활용한 HTTPS 환경을 구축하였다.
초기에 mod_ssl 패키지를 설치하고 기본 SSL 설정 파일(/etc/httpd/conf.d/ssl.conf)을 검토하여 불필요하거나 충돌 가능성이 있는 설정을 제거한 후, WordPress 사이트에 적합한 별도 SSL 설정 파일(wordpress-ssl.conf)을 생성하였다.

Let's Encrypt를 활용한 인증서는 무료이면서도 브라우저와의 호환성이 높아 실무 환경에서도 널리 사용된다. 인증서를 수동 발급하기 위해 openssl 명령어를 사용해 자체 서명된 인증서(localhost.crt, localhost.key)를 /etc/pki/tls/경로에 생성하였고, Apache 설정에서 해당 경로를 명시했다.

설정 완료 후 apachectl configtest로 문법 오류를 검증하고 Apache를 재시작하여 HTTPS 접속이 가능함을 확인했다. 접속 시 브라우저에서 "주의: 보안 연결이 완전하지 않을 수 있음" 메시지가 출력되더라도, 자체 서명 인증서 기반의 HTTPS 연결이 정상적으로 동작하는 것은 실무에서도 초기에 테스트 및 내부 망에 유용하게 쓰일 수 있다.

특히, HTTPS 적용을 통해 WordPress 관리자 페이지와 사용자 로그인 정보 전송이 암호화되었으며, 이후 Wordfence 및 DISALLOW_FILE_EDIT, DISALLOW_FILE_MODS 설정과 함께 다중 보안 계층을 형성하여 외부 공격으로부터의 방어 체계를 마련하였다.

https://localhost 접속

"Warning: Potential Security Risk Ahead" → "Advanced
→ Accept the Risk and Continue"

ls -l /etc/pki/tls/certs/localhost.crt 파일 정상적으로 생성됨

ls -l /etc/pki/tls/private/localhost.key 파일 정상적으로 생성됨

Apache 구문 오류 검사 통과


Monitoring with Prometheus and Grafana

본 단계에서는 Prometheus와 Grafana를 활용하여 WordPress 서버의 시스템 상태를 실시간으로 수집, 시각화하는 모니터링 환경을 구축했다.
Prometheus는 Node Exporter로부터 수집한 메트릭 데이터를 주기적으로 스크래핑하며, Grafana는 해당 데이터를 기반으로 대시보드를 구성해 직관적인 시각 정보를 제공한다.

구성 요소

  • Node Exporter: CPU, 메모리, 디스크, 네트워크 등의 시스템 메트릭 제공
  • Prometheus: /metrics 엔드포인트 수집 및 시계열 DB 저장
  • Grafana: Prometheus 데이터 시각화 및 대시보드 구성

구현한 주요 패널 구성

  1. CPU Usage (%)
    시각화 방식: Gauge
    쿼리: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

  2. Memory Usage (%)
    시각화 방식: Gauge
    쿼리: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100

  1. Disk Usage (%)
    시각화 방식: Bar Gauge
    쿼리: (node_filesystem_size_bytes - node_filesystem_free_bytes) / node_filesystem_size_bytes * 100

  2. CPU Load Average
    시각화 방식: Stat
    쿼리: node_load1

  3. Network Inbound
    시각화 방식: Time Series
    쿼리: rate(node_network_receive_bytes_total[5m])

  4. Network Outbound
    시각화 방식: Time Series
    쿼리: rate(node_network_transmit_bytes_total[5m])

Prometheus Target 상태 확인

Node_Exporter와 Prometheus가 모두 UP인 것을 확인

Grafana Data Sources default는 Prometheus

Grafana - Data Source 설정에서 Prometheus 연결 확인

Grafana 대시보드 전체 뷰

Network Inbound 설정 화면


Troubleshooting & Real-world Challenges

이번 프로젝트를 진행하며 여러 시스템 환경 변수와 충돌하는 문제를 직접 마주하고 해결해가는 과정을 통해 실무에서 발생 가능한 고급 이슈에 대한 감각을 키울 수 있었다.

가장 먼저 마주한 문제는 Apache + PHP-FPM 연동 과정에서의 500 Internal Server Error였다. 단순 설정 오류로 치부하지 않고 /var/log/httpd/error_log, PHP-FPM 서비스 로그까지 함께 확인하며 문제 원인을 추적했고, PHP를 proxy_fcgi 방식으로 처리하는 구조를 명확히 이해한 뒤 해결에 성공했다.

또한, 대부분 실습 환경에서는 비활성화하는 SELinux를 enforcing 모드로 유지한 채 작업을 진행했다. 이 과정에서 Apache와 PHP의 모듈 동작 권한, 인증서 파일 접근 권한이 충돌하는 부분을 restorecon, semanage, 로그 분석 등을 통해 해결해나갔다. SELinux 설정을 우회하지 않고 정책 안에서 문제를 풀어낸 점은, 보안을 고려한 시스템 운영 관점에서 특히 주목할 부분이다.

Grafana 설치에서도 yum 저장소가 닫힌 상황에서 포기하지 않고, 공식 .rpm 파일을 직접 다운로드하고 수동으로 설치하여 서비스 등록 및 실행까지 완료했으며, systemd 등록 후 상태 확인, 활성화까지 모든 과정이 자동화될 수 있게 구성했다.

마지막으로, Grafana 대시보드 구성에서도 단순 시각화가 아닌 실제 운영에 적합한 가로 3열 패널 구성, CPU 사용률, 메모리 사용률, 디스크 사용률, Load Average, 네트워크 트래픽까지 핵심 지표들을 시계열 + 게이지 방식으로 정리했다. 데이터 자체를 보여주는 것을 넘어서, 실시간 상황 판단이 가능한 구조로 시각화했다.

이러한 경험을 통해 단순히 설정을 따라 하기보다는, 문제가 발생했을 때 이를 분석하고 실무 환경에서도 적용 가능한 방식으로 직접 해결해보는 사고력과 기술 실천력을 갖추게 되었다고 느꼈다.

(자세한 트러블 슈팅 항목 -> Troubleshooting Details)


System Architecture Diagram


Strengths of the System

이번 프로젝트에서 구축한 시스템은 단순한 WordPress 설치를 넘어, 보안성, 확장성, 자동화, 가시성을 모두 고려한 종합적인 인프라 환경이다. 실무에 바로 적용 가능한 구조로 구성했으며, 다음과 같은 강점을 갖고 있다.

1. 보안성 중심의 구성
SELinux를 Enforcing 모드로 유지한 채 모든 설정을 적용함으로써, 시스템 단에서의 정책 기반 보안을 실현했다. 또한, firewalld로 포트 접근 제어, ModSecurity(WAF)를 통한 웹 공격 차단 설정까지 적용하여 실제 서비스 수준의 보안 레벨을 구현했다. 이외에도, WordPress 내부 코드 수정을 막는 DISALLOW_FILE_EDIT, DISALLOW_FILE_MODS 설정으로 내부 보안 취약점도 방어했다.

2. 운영 관점에서 강력한 가시성 확보
Prometheus + Node Exporter + Grafana 조합을 통해 실시간으로 CPU, 메모리, 디스크, 네트워크 사용량을 대시보드로 시각화했다. 이를 통해 시스템 과부하나 자원 병목 현상을 사전에 탐지하고 대응할 수 있는 운영 가시성을 갖추었다.

3. 자동화 기반의 효율적 구성
Ansible을 활용하여 Apache, PHP, MariaDB, WordPress, 모니터링 도구 설치 및 설정을 자동화하여 반복적인 수동 작업을 줄이고 재현 가능하고 일관된 인프라 구축이 가능해졌다. 추후 백업/복구, 배포 자동화까지 확장할 수 있는 기반을 마련했다.

4. 실무 환경과 유사한 구조
Rocky Linux, php-fpm, mod_ssl, systemctl, VirtualBox, Shell Script, logrotate 등 실제 현업에서 사용하는 기술들로만 구성했다. 단순 학습용이 아닌 실무자가 바로 이해하고 유지보수할 수 있는 구조와 표준 설정 방식을 따랐다.

5. 문제 해결 경험 기반
SSL 인증서 오류, SELinux 충돌, 500/503 에러, php-fpm 연동 실패, Grafana 수동 설치 등 다양한 이슈를 직접 해결하며 실제 운영 상황에 대응할 수 있는 실무 역량을 체득했다.


Troubleshooting Details

Apache 초기 페이지에서 WordPress 화면이 출력되지 않음

  • 원인: 기본 Apache 설정 상태로 /var/www/html/index.html만 표시됨
  • 해결: index.html 제거 후 index.php가 로드되도록 설정

Grafana repository 접근 불가 (404 오류)

php-fpm 및 WordPress 권한 오류 (SELinux)

  • 원인: SELinux enforcing 상태에서 /var/www/html/wordpress 디렉토리 접근 권한 부족
  • 해결: audit.log에서 denied 메시지를 grep하여 문제 위치 확인 후, semanage fcontext 및 restorecon 명령어로 context 재설정

화면: ls -Z /var/www/html/wordpress

semanage 명령어가 작동하지 않음

  • 원인: policycoreutils-python-utils 패키지 미설치
  • 해결: dnf install -y policycoreutils-python-utils로 설치 시도 (단, Grafana 저장소 오류로 이 역시 실패함 → 수동 설치 고려 필요)

getenforce로 SELinux 상태 확인 시 enforcing 상태 유지

  • 대응: 강제적으로 permissive 모드로 바꾸지 않고, SELinux 정책 수정을 통한 설정 유지 및 실무 친화적인 대응 방식으로 유지

WordPress 테마 편집/플러그인 설치 불가 상태로 유지

  • 의도: wp-config.php 내 DISALLOW_FILE_EDIT 및 DISALLOW_FILE_MODS 설정 적용
  • 결과: 보안 상 WordPress 관리자 UI에서 직접 코드/플러그인 수정 불가, 보안 강화를 위한 설정 완료

Grafana 대시보드 레이아웃 불편

  • 문제: 모든 패널이 세로로만 정렬되어 시각적 불편함 발생
  • 해결: 각 패널 편집 → Panel options → Width 비율 수동 조절을 통해 가로 3개 배치로 개선

Prometheus 접속 시 SSL 오류 (SSL_ERROR_RX_RECORD_TOO_LONG)

Apache 설정 구문 오류 발생 여부 확인

  • 조치: apachectl configtest 명령어로 구문 확인
  • 출력: "Syntax OK" 메시지로 설정 정상 여부 확인

WordPress 내부 플러그인 관련 오류 처리

  • 원인: Wordfence 설치 후 관리자 패널이 작동하지 않거나 로그인 차단 이슈 발생 가능성
  • 조치: 2FA 설정 및 경고 이메일 확인, 로그인 제한 조건 재설정하여 정상 복구

Conclusion & What I Learned

이번 SecureWP 프로젝트를 통해 시스템 인프라의 계획-구축-보안 강화-모니터링-문제 해결에 이르는 전 과정을 실습하며, 현업에서도 필요한 기술 역량을 종합적으로 익힐 수 있었다. 단순히 워드프레스를 설치하는 것을 넘어, 보안 강화를 위한 Wordfence 설정, 2FA 인증, SELinux 설정, 방화벽 규칙 구성 등 실무에서 반드시 필요한 절차들을 직접 수행했다.

특히 Ansible을 활용한 자동화 구성 관리는 서버 세팅의 일관성과 반복 가능성을 확보하는 데 큰 도움이 되었고, 문제가 발생했을 때 로그 분석, SELinux 트러블슈팅, 서비스 상태 확인, 포트 상태 점검 등 다양한 디버깅 스킬을 통해 실시간 문제 해결 경험을 쌓을 수 있었다. 또한 Prometheus + Node Exporter + Grafana 연동을 통해 시스템 자원(CPU, 메모리, 디스크, 네트워크)의 사용 현황을 시각화하여 시스템 상태를 한눈에 파악할 수 있는 모니터링 환경을 구현한 점은 큰 성과였다.

이 과정을 통해 단순한 기능 구현을 넘어 "보안", "운영", "가시성", "자동화", "유지보수"를 고려하는 인프라 마인드셋을 기를 수 있었고, 실무 환경에서 예기치 못한 이슈가 발생하더라도 원인을 빠르게 파악하고 대응할 수 있는 기반 지식과 경험을 확보할 수 있었다.

또한 기록 중심의 작업 방식으로, 모든 설정 및 트러블슈팅 과정을 문서화하고, 스크린샷 등 시각적 증거까지 확보함으로써 신뢰도 높은 기술 포트폴리오를 완성할 수 있었다. 이 프로젝트는 단지 기술 스택을 나열하는 것을 넘어서, 직접 경험하고 해결한 실전 중심의 프로젝트였기에 그 의미가 더욱 크다고 느껴진다.

profile
똑똑해지고 싶은 공학도

0개의 댓글