[모의해킹 스터디] SELinux

바울·2024년 11월 3일
0

모의해킹 스터디

목록 보기
5/40

2주 차에 웹 서버랑 DB를 연결하면서 생긴 에러가 있다. 찾아보니 selinux 때문에 생긴 에러여서 selinux에 대해 포스팅해보고자 한다.

SELinux?

SELinux(Security-Enhanced Linux)은 리눅스 시스템의 보안을 강화하기 위한 접근 제어 메커니즘입니다. 주로 서버 환경에서 사용되며, 강력한 보안 정책을 적용해 시스템을 보호합니다.


Troubleshooting

로그인 및 회원가입 로직을 모두 작성 후 둘다 DB에 연결을 시도해 보았다.

URL를 확인해 보면 로그인 페이지 및 회원가입 페이지에서 서버로 값을 전달 후 처리하는 과정에서 에러가 난 거 같다. Permissiom denied 에러에 대해 찾아보았다. 찾아보니 파일이나 디렉터리에 접근 권한이 없을 때 발생하는 에러라고 해서 파일 사용자 권한을 건드려 보았지만 달라지는 게 없어서 계속 찾아보니 selinux 관련 에러 일 수도 있다고 해서 setenforce 0 명령어를 사용해 일시적으로 selinux를 비활성화 시키고 웹에서 DB 연결을 시도해 본 결과 DB 연결이 문제없이 되었다. selinux는 설정 및 관리가 복잡하고, 일부 애플리케이션이 정상 동작하지 않을 수 있어 개인 서버에서 웹 개발시 비활성화 하고 작업을 할 수 있지만 비활성화 시 보안적인 측면에서 좋지않기 때문에 정책을 수정해 보기로 해서 selinux에서 차단된 액세스 로그를 기록하는 파일을 살펴보았다.

로그를 살펴보면 똑같은 에러가 여러 번 발생한 걸 알 수 있다.

type=AVC msg=audit(1728862615.190:944): avc:  denied  { connectto } for  pid=29463 comm="php-fpm" path="/var/lib/mysql/mysql.sock" scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:system_r:unconfined_service_t:s0 tclass=unix_stream_socket permissive=0

에러를 분석해 보면 PHP-FPM이 MySQL 소켓에 연결하려는 것을 selinux가 차단을 하고 MySQL 소켓이 unconfined_service_t 타입으로 설정되어 있어 httpd_t 컨텍스트에서 접근이 허용되지 않는 상태인 걸 알 수 있다. 좀 더 자세히 보기위해 mysql.sock을 살펴보자

ls -Z 명령어를 사용해 파일의 SELinux 보안 컨텍스트 정보를 표시 후 내용에 대해 찾아보니 selinux에서 mysqld_db_t 유형은 MySQL 프로세스에만 접근이 허용된다고 한다.
이러한 이유 때문에 httpd가 소켓에 접근할 때 에러가 발생한 것이다. httpd_can_network_connect_db 외에도 소켓 파일의 selinux 유형을 httpd가 접근할 수 있는 유형으로 조정해야 할 거 같다.

일단 setsebool 명령어를 이용해 selinux 정책에서 httpd(Apache) 프로세스가 네트워크를 통해 데이터베이스에 연결할 수 있도록 허용하고 -P 옵션을 사용해 재부팅 후에도 설정이 유지될 수 있게 해주었다.

audit2allow 도구를 사용해 차단된 접근 시도를 허용하는 정책 모듈을 새로 생성해 주었다. 디렉터리를 보면 mypol.pp mypol.te 파일이 생성된 걸 볼 수 있다. 두 파일의 차이는 쉽게 설명하면 mypol.te는 사람이 읽고 수정할 수 있는 소스 파일이고, mypol.pp는 시스템에 설치할 수 있도록 컴파일된 파일이라고 할 수 있다.

semodule 명령어를 사용해 이전 명령에서 생성된 mypol.pp 정책 모듈을 selinux에 적용하면 차단된 접근 시도를 허용하는 정책이 시스템에 영구적으로 추가되고 selinux는 새로운 설정에 따라 차단된 접근 시도를 허용하게 된다.

0개의 댓글