WEB_WAS/APACHE

setcap을 이용한 Apache(아파치) 기동 권한 설정

코딩금융치료 2025. 3. 17. 14:27

1. setcap이란?

setcap은 Linux에서 실행 파일에 특정한 **Capabilities(권한)**을 부여하는 명령어입니다. 일반적으로 1024 이하의 포트(Well-known Ports)는 root 권한이 있는 프로세스만 바인딩 가능하지만, setcap을 이용하면 루트 권한 없이도 특정 실행 파일이 이러한 포트를 사용할 수 있습니다.

Apache 웹 서버(httpd)는 기본적으로 80번(HTTP), 443번(HTTPS) 포트에서 실행되기 때문에 일반 사용자로 실행할 경우 포트 바인딩에 실패합니다. 이를 해결하기 위해 보통 Apache는 root 권한으로 실행되었다가, 이후 일반 사용자(apache, www-data 등)로 변경됩니다. 하지만 보안상 root로 실행하는 것은 위험할 수 있기 때문에 setcap을 사용하면 루트 권한 없이도 Apache가 80/443 포트에 바인딩할 수 있도록 설정할 수 있습니다.


2. setcap을 사용해야 하는 이유

(1) 보안 강화

  • 기본적으로 Apache는 루트(root) 권한으로 시작되며, 이는 보안상 위험할 수 있음.
  • setcap을 사용하면 불필요한 루트 권한 없이도 80, 443 포트를 사용할 수 있음.

(2) 시스템 관리 효율성 증가

  • 서버 운영 시, 모든 프로세스를 루트 사용자로 실행하는 것은 보안 취약점을 증가시킴.
  • 특정 실행 파일에만 필요한 권한을 부여하여 관리 가능.

(3) SELinux와의 충돌 방지

  • 일부 환경에서는 Apache 실행 시 SELinux와 충돌이 발생할 수 있음.
  • setcap을 적용하면 SELinux 정책을 변경하지 않고도 Apache를 정상 실행할 수 있음.

3. setcap을 이용한 Apache 설정 방법

1) httpd 실행 파일 경로 확인

먼저, httpd 실행 파일의 정확한 경로를 확인해야 합니다.

which httpd

출력 예시:

/usr/sbin/httpd

또는

whereis httpd

출력 예시:

httpd: /usr/sbin/httpd /etc/httpd /usr/lib64/httpd

2) CAP_NET_BIND_SERVICE 권한 부여

다음 명령어를 사용하여 httpd 실행 파일에 1024 이하 포트(80, 443) 바인딩 권한을 부여합니다.

sudo setcap 'cap_net_bind_service=+ep' /usr/sbin/httpd

 3) 설정 확인

설정이 정상적으로 적용되었는지 확인하려면 아래 명령어를 실행합니다.

getcap /usr/sbin/httpd

출력 예시:

/usr/sbin/httpd = cap_net_bind_service+ep

4) Apache 재시작 및 확인

설정이 적용된 후 Apache를 다시 시작합니다.

sudo systemctl restart httpd

정상적으로 실행되는지 확인합니다.

sudo systemctl status httpd

4. setcap 적용 후 고려 사항 및 문제 해결

 SELinux 활성화 여부 확인

만약 setcap을 적용했는데도 Apache가 80, 443 포트를 사용하지 못하는 경우, SELinux 설정을 확인하세요.

getenforce
  • Enforcing이면 SELinux가 적용되고 있는 상태입니다.
  • 일시적으로 비활성화하여 테스트해볼 수 있습니다.
    sudo setenforce 0
    sudo systemctl restart httpd
    
  • 정상 동작한다면, SELinux 정책을 조정해야 합니다.

 setcap 패키지 설치 여부 확인

만약 setcap 명령어가 실행되지 않는다면 패키지가 설치되지 않았을 수 있습니다.

sudo yum install libcap  # RHEL, CentOS
sudo apt install libcap2-bin  # Ubuntu, Debian

 setcap 설정이 사라지는 문제 해결

Apache(httpd)를 업데이트하면 setcap 설정이 초기화될 수 있습니다. 따라서 업데이트 후 다시 적용해야 합니다.

sudo setcap 'cap_net_bind_service=+ep' /usr/sbin/httpd

이를 자동화하기 위해 /etc/rc.local 또는 시스템 관리 스크립트에 추가할 수도 있습니다.


5. 결론

✔ setcap을 사용하면 Apache가 root 없이도 80, 443 포트에 바인딩 가능하여 보안성이 향상됩니다.
✔ Apache를 실행할 때 불필요한 루트 권한을 줄여 시스템 보안을 강화할 수 있습니다.
✔ 패키지 업데이트 시 setcap 설정이 초기화될 수 있으므로 재설정이 필요할 수 있음을 기억하세요.

setcap을 적절히 활용하면 Apache 서버의 보안을 강화하면서도 관리의 편리성을 유지할 수 있습니다. 🚀