[리눅스] RHCSA 9(5), SELinux 트러블 슈팅 (feat. semanage, sealert, curl, ncat)

반응형

 

문제6. SELinux 디버깅 문제

httpd 기본 디렉토리는 /var/www/html이며, 관련 파일 및 디렉토리는 변경/삭제하지 않는다.
웹 브라우저를 통해 현재 서버에 접속하여 /var/www/html/ 내 html 파일들이 정상적으로 보여지는지 확인한다.
httpd 기본 포트는 82이며, 변경하지 않는다.
서버가 재부팅 될 때, httpd 서비스는 유지되어야 한다.
이 문제의 초기 상태는 서버의 SELinux가 Enforcing 상태이며, SELinux로 인해 httpd 서비스가 failed 되어있다.

 

 

현재 상태 파악

아래 내용을 통해 이런 생각을 해야한다.

'SELinux 활성 상태에서 httpd 재시작 결과가 실패다, 그러면 SELinux를 비활성화 하고 재시작하면 어떨까?'

[servera]# systemctl status httpd  // 현재 httpd 서비스 비정상 상태
× httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor pres>
   Active: failed (Result: exit-code) since Wed 2024-04-03 23:43:31 KST; 9s ago
     Docs: man:httpd.service(8)
  Process: 1195 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, s>
 Main PID: 1195 (code=exited, status=1/FAILURE)
   Status: "Reading configuration..."


[servera]# getenforce
Enforcing  // SELinux 활성화 상태


[servera]# systemctl restart httpd  // SELinux 활성 상태에서 httpd 재시작했지만 실패
Job for httpd.service failed because the control process exited with error code.
See "systemctl status httpd.service" and "journalctl -xe" for details.

 

 

Enforcing → Permissive 변경 후 재시작했더니 정상 기동되었다.

그렇다는 건 SELinux 정책이 http 서비스 기동에 영향을 주고 있다는 뜻으로 해석할 수 있다.

[servera]# setenforce 0  // selinux 비활성화
[servera]# getenforce  // selinux 상태 확인
Permissive


[servera]# systemctl restart httpd
[servera]# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor pres>
   Active: active (running) since Wed 2024-04-03 23:45:32 KST; 19min ago
     Docs: man:httpd.service(8)
 Main PID: 1670 (httpd)
   Status: "Running, listening on: port 82"
    Tasks: 213 (limit: 12083)

 

 

로그 분석

httpd src=82이 denied 되었다는 로그를 확인할 수 있다.

sealert 로그 분석 Tool을 쓰게 되면 자세한 에러 내용과 대처 방법까지 안내해준다.

* sealert 명령어가 없을 때 설치하는 방법

[servera]# vi /var/log/audit/audit.log
/src  // src로 검색
type=AVC msg=audit(1711955230.858:138): avc:  denied  { name_bind } for  pid=1195 comm="httpd" src=82 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:reserved_port_t:s0 tclass=tcp_socket permissive=0

또는

[servera]# sealert -a /var/log/audit/audit.log  // SELinux 로그 분석 Tool

* sealert 명령어가 없을 때
[servera]# dnf install -y setroubleshoot-server

 

 

문제해결, SELinux / Firewall 정책 수정

[servera]# semanage port -l | grep -i http_port_t  // 82 포트가 정책에 없다..!!
http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t            tcp      5988


[servera]# semanage port -a -t http_port_t -p tcp 82  // 지우는 옵션은 -a 대신 -d


[servera]# semanage port -l | grep -i http_port_t  // 82 포트가 정책에 추가됨
http_port_t                    tcp      82, 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t            tcp      5988


[servera]# firewall-cmd --add-port=82/tcp
success
[servera]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160
  sources:
  services: cockpit dhcpv6-client ssh
  ports: 82/tcp
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:


* semanage 명령어가 없는 경우
[servera]# semanage
-bash: semanage: command not found
[servera]# dnf install policycoreutils-python-utils  // 해당 파일 설치

 

 

SELinux 활성화 및 서비스 재시작, 부팅 시 서비스 자동 시작 등록

[servera]# setenforce 1
[servera]# getenforce
Enforcing

[servera]# systemctl restart httpd
[servera]# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor pres>
   Active: active (running) since Thu 2024-04-04 01:01:22 KST; 3s ago
     Docs: man:httpd.service(8)
 Main PID: 2373 (httpd)
   Status: "Started, listening on: port 82"
    Tasks: 213 (limit: 12083)


[servera]# systemctl enable httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.

 

 

http 정상 여부 확인(feat. curl, ncat)

* 82 포트로 정상 연결 확인된다.
[servera]# curl localhost:82
<!doctype html>
<html>
  <head>
    <meta charset='utf-8'>
    <meta name='viewport' content='width=device-width, initial-scale=1'>
    <title>HTTP Server Test Page powered by: Rocky Linux</title>
    <style type="text/css">
(생략..)


[servera]# ncat -zv localhost 82
Ncat: Version 7.92 ( https://nmap.org/ncat )
Ncat: Connected to ::1:82.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.


* http 82가 아닌 다른 포트로 확인해보면 연결 실패를 확인할 수 있다.
[servera]# curl localhost:80
curl: (7) Failed to connect to localhost port 80: Connection refused


[servera]# ncat -zv localhost 80
Ncat: Version 7.92 ( https://nmap.org/ncat )
Ncat: Connection to ::1 failed: Connection refused.
Ncat: Trying next address...
Ncat: Connection refused.
반응형

댓글

Designed by JB FACTORY