소개
실제 관리 작업에서 문제가 단 하나의 명령어로 해결되는 경우는 드뭅니다. 서비스는 유닛이 비활성화되었거나, 서비스 사용자가 콘텐츠를 읽을 수 없거나, SELinux 레이블이 불완전하거나, 방화벽이 필요한 포트를 열어두지 않았을 때 실패할 수 있습니다.
이 실습에서는 준비된 웹 서비스 호스트를 복구합니다. 이 서비스는 labex 사용자로 실행되어야 하며, /srv/rhcsa-review/site에서 콘텐츠를 제공하고, 127.0.0.1:18082 포트에서 수신 대기하며, 부팅 시 활성화되고, 올바른 SELinux 레이블을 가지며, firewalld 를 통해 18082/tcp 포트를 개방해야 합니다.
서비스 실패 재현 및 진단
이 단계에서는 서비스 실패를 재현하고 변경 사항을 적용하기 전에 증거를 검사합니다. systemctl과 journalctl로 시작하여 로그 메시지와 파일 권한을 비교합니다.
초기 설정에서는 public 영역에 SSH와 3002/tcp 포트의 LabEx 브라우저 터미널 접속을 허용하는 영구 규칙을 구성해 두었습니다. 애플리케이션의 방화벽 정책을 변경할 때도 이 관리용 접속 규칙을 유지하십시오.
프로젝트 디렉토리로 이동합니다.
cd /home/labex/project
준비된 서비스를 확인합니다. 서비스는 존재하지만 아직 실행 중이지 않습니다.
systemctl status rhcsa-review-web.service --no-pager || true
서비스를 시작해 봅니다. 서비스가 labex 사용자로 실행되지만 해당 사용자가 콘텐츠 디렉토리에 접근할 수 없기 때문에 실패할 것입니다.
sudo systemctl start rhcsa-review-web.service || echo "service start failed as expected"
sleep 1
systemd 가 해당 유닛을 실패 상태로 표시했는지 확인합니다.
systemctl is-failed rhcsa-review-web.service || true
가장 최근의 서비스 로그 항목을 읽습니다. 저널 (journal) 을 통해 서비스 계정이 구성된 작업 디렉토리나 콘텐츠 경로를 사용하는 데 실패했음을 알 수 있습니다.
sudo journalctl -u rhcsa-review-web.service -n 20 --no-pager
콘텐츠 경로의 권한을 검사합니다.
sudo stat -c '%a %U:%G %n' /srv/rhcsa-review /srv/rhcsa-review/site /srv/rhcsa-review/site/index.html
콘텐츠 권한 복구
이 단계에서는 서비스 계정이 콘텐츠를 읽을 수 있도록 하되, 모든 사용자가 읽을 수 있게 (world-readable) 만들지는 않으면서 권한을 수정합니다. 서비스는 labex 사용자와 labex 그룹으로 실행됩니다.
디렉토리 트리의 그룹을 labex로 설정합니다. 서비스는 labex 그룹으로 실행되므로, 그룹 소유권을 변경하면 서비스 사용자가 파일의 소유자가 아니더라도 접근 권한을 부여할 수 있습니다.
sudo chown root:labex /srv/rhcsa-review /srv/rhcsa-review/site /srv/rhcsa-review/site/index.html
그룹이 디렉토리를 탐색하고 콘텐츠 파일을 읽을 수 있도록 허용합니다. 디렉토리는 탐색을 위해 실행 (execute) 비트가 필요하며, HTML 파일은 서비스가 제공할 수 있도록 읽기 (read) 비트가 필요합니다.
sudo chmod 750 /srv/rhcsa-review /srv/rhcsa-review/site
sudo chmod 640 /srv/rhcsa-review/site/index.html
복구된 권한을 검사합니다.
sudo stat -c '%a %U:%G %n' /srv/rhcsa-review /srv/rhcsa-review/site /srv/rhcsa-review/site/index.html
실패 상태를 초기화하고 서비스를 다시 시작합니다. reset-failed는 이전의 실패 표시를 제거하여 권한 복구 후 systemctl 상태를 더 쉽게 확인할 수 있게 합니다.
sudo systemctl reset-failed rhcsa-review-web.service
sudo systemctl start rhcsa-review-web.service
sleep 1
서비스가 활성화되어 콘텐츠를 제공하는지 확인합니다.
systemctl is-active rhcsa-review-web.service
curl -s http://127.0.0.1:18082/
서비스 영구 설정
이 단계에서는 복구된 서비스를 활성화하여 부팅 시 자동으로 시작되도록 합니다. 다음 부팅까지만 작동하는 서비스는 완전히 복구된 것이 아닙니다.
유닛을 활성화합니다. 시작 (start) 은 현재 부팅 상태를 수정하는 것이며, 활성화 (enable) 는 복구된 서비스가 일반 부팅 타겟에서 자동으로 시작되어야 함을 기록하는 것입니다.
sudo systemctl enable rhcsa-review-web.service
활성화 상태를 확인합니다.
systemctl is-enabled rhcsa-review-web.service
서비스를 재시작하여 권한 복구 후에도 유닛이 정상적으로 시작되는지 확인합니다. 단순히 실행 중인 프로세스를 확인하는 것보다 깔끔한 재시작이 더 확실한 증거가 됩니다.
sudo systemctl restart rhcsa-review-web.service
sleep 1
서비스를 다시 테스트합니다.
systemctl is-active rhcsa-review-web.service
curl -s http://127.0.0.1:18082/
SELinux 컨텍스트 및 포트 레이블 추가
이 단계에서는 SELinux 정책 메타데이터가 서비스 설계와 일치하도록 만듭니다. 간단한 데모 서비스가 콘텐츠를 읽을 수 있더라도, RHCSA 스타일의 웹 서비스 복구에는 영구적인 파일 컨텍스트와 포트 레이블 설정이 포함되어야 합니다.
서비스 콘텐츠에 대한 영구적인 HTTP 콘텐츠 컨텍스트 규칙을 추가합니다. fcontext 규칙은 영구적인 정책 메타데이터로, SELinux 에게 레이블 재지정 (relabeling) 후 이 경로가 어떤 레이블을 가져야 하는지 알려줍니다.
sudo semanage fcontext -a -t httpd_sys_content_t '/srv/rhcsa-review/site(/.*)?'
기존 파일에 규칙을 적용합니다. restorecon은 영구 규칙을 읽고 이미 존재하는 파일에 올바른 레이블을 적용합니다.
sudo restorecon -Rv /srv/rhcsa-review/site
사용자 지정 규칙과 적용된 레이블을 검사합니다.
sudo semanage fcontext -l | grep '/srv/rhcsa-review/site'
ls -Zd /srv/rhcsa-review/site /srv/rhcsa-review/site/index.html
서비스 포트를 HTTP 포트 유형에 추가합니다. 포트 레이블을 통해 SELinux 정책은 TCP 18082가 HTTP 스타일의 서비스 트래픽을 위한 것임을 이해하게 됩니다.
sudo semanage port -a -t http_port_t -p tcp 18082
HTTP 포트 레이블을 검사합니다.
sudo semanage port -l | grep '^http_port_t'
방화벽 개방 및 종단 간 검증
이 단계에서는 firewalld 를 통해 서비스 포트를 개방하고 최종 감사를 수행합니다. 서비스는 활성화되고, 부팅 시 시작되도록 설정되며, 레이블이 지정되고, 호스트 방화벽에 의해 허용되어야 합니다.
firewalld 를 시작하고 활성화합니다.
sudo systemctl enable --now firewalld
서비스 포트를 영구적으로 추가하고 방화벽을 다시 로드합니다. 영구 규칙은 방화벽 재로드 후에도 유지되며, 재로드를 통해 활성 방화벽에 규칙이 적용됩니다.
sudo firewall-cmd --permanent --add-port=18082/tcp
sudo firewall-cmd --reload
활성 포트 목록을 검사합니다.
sudo firewall-cmd --list-ports
최종 서비스 점검을 수행합니다. 이 명령어들은 서비스가 부팅 시 활성화되고, 현재 실행 중이며, 예상되는 로컬 웹 응답을 반환하는지 확인합니다.
systemctl is-enabled rhcsa-review-web.service
systemctl is-active rhcsa-review-web.service
curl -s http://127.0.0.1:18082/
마지막으로 콘텐츠 권한을 감사합니다. 이 최종 권한 확인은 흔히 발생하는 부분적 복구 오류 (서비스는 작동하지만 접근 모델이 의도보다 넓거나 좁은 경우) 를 방지합니다.
sudo stat -c '%a %U:%G %n' /srv/rhcsa-review /srv/rhcsa-review/site /srv/rhcsa-review/site/index.html
요약
실패한 systemd 유닛 진단, 서비스 사용자 권한 수정, 서비스 활성화, SELinux 파일 및 포트 레이블 추가, 방화벽 개방, 그리고 최종 웹 응답 검증을 통해 다중 문제 서비스 호스트를 성공적으로 복구했습니다.



