지난주 글에서 예고(?)드렸던 1024 이하 포트를 sudo나 root 없이 사용하는 방법입니다.

자신있게 적었지만, 제가 테스트하고 있는 환경은 지원이 안돼서 아직 성공하지 못했습니다.

다른 환경을 구하게 되면 해당 내용 추가하도록 하겠습니다.

 

1. 배경

Kernel을 사용하는 데 있어서 권한이 있는 사용자, 프로세스가 해당 자원을 사용하도록 하는 게 보안을 위해 굉장히 중요하지요.

기존 UNIX같은 경우에는 이런 권한을 해당 프로세스의 사용자가 super user(root)인지를 통해서 판단하도록 했습니다.

즉 해당 자원을 사용하기 위해서는 super user로 프로세스를 실행시켜야 하고, super user가 실행하는 프로세스라면 앞뒤 따지지 않고 모든 권한을 주고 있습니다.

왜 굳이 1024 이하의 포트를 super user만 사용하게 해서 이런 고통을 주는지, 그 이유는

사용자에게 '당신이 1024 이하의 포트에 접속한다면 그건 super user가 기동한 프로세스에 접속하는 것이니 믿어도 된다'는 의미를 주기 위한 거라고 하네요.

참고 : http://www.w3.org/Daemon/User/Installation/PrivilegedPorts.html

 

2. Linux는

Linux Kernel 2.2부터는 capability라고 해서 이러한 권한을 영역별로 묶어서 Thread나 File에 할당/관리합니다.

이렇게 묶어둔 권한은 CAP_SYS_BOOT(재기동 할 수 있는 권한), CAP_MAC_ADMIN, CAP_IPC_LOCK, CAP_CHOWN 등등 다양해서 프로그램 별 권한을 조정하거나 super user를 주는 게 아니라 필요한 권한만 주도록 할 수 있습니다.

1024 아래의 포트를 사용하는 데 필요한 권한은 CAP_NEW_BIND_SERVICE 입니다.

 

3. 권한 설정 방법과 Linux 버전에 따른 지원

 setcap이라는 명령어를 사용합니다. 사용 예는 아래와 같습니다.

 shell> setcap cap_net_bind_service=+ep /usr/local/nginx/bin/nginx

단, setcap이라는 명령어를 통해 실행 파일에 위와 같은 권한을 주려면 2.6.24 kernel 이상이 되어야 한다고 합니다.

2.6.24 이상 Kernel을 사용하고 있는 Linux는 CentOS와 RHEL 6.0 이상부터라고 합니다.