리눅스에서 일반 사용자가 1024 이하의 포트를 사용할 수 있도록 설정하는 방법(setcap/getcap)
3. Linux에서 setcap 명령으로 capabilities 설정
리눅스의 capabilities 설정을 통해서 일반 유저가 1024 이하 포트 사용이 가능하다. capabilities란 무엇일까? 전통적인 유닉스/리눅스에서는 root가 모든 권한을 가진다. 일반유저가 root의 일부 권한을 갖기 위해서는 SetUID/SetGID나 sudo 등 기초적인 방법으로 권한을 부여할 수밖에 없었다. 하지만 capabilities는 root의 권한을 세분화(커널 모듈 load/remove, 파일 소유자/소유그룹 변경, kill 권한, ping 허용(ICMP허용), 리부팅 등)하여, 일반 유저도 root의 다양한 권한을 갖도록 만든 보안 모델이다. 일반 유저에게 패킷 모니터링 툴을 사용할 수 있도록 허용할 수 있다. PAM 모듈을 사용하면 user를 지정하여 권한 부여도 할 수 있다.
capabilities은 커널에서 지원해야 하며, File capabilities를 위해서는 2.6.24 이상을 사용하면 된다. 설정은 setcap, getcap 명령을 사용한다.
capabilities 맨 페이지를 보면, CAP_NET_BIND_SERVICE이 1024 이하 포트(privileged ports)에 대해 권한 부여 역할을 한다.
CAP_NET_BIND_SERVICE
Bind a socket to Internet domain privileged ports (port numbers less than 1024).
1) capabilities 설정을 위해 libcap2가 패키지가 필요하다.
① 데비안/우분투는 libcap2-bin 패키지(setcap, getcap 등의 명령이 있음)를 설치한다.
② CentOS는 http://www.kernel.org/pub/linux/libs/security/linux-privs/libcap2/ 에서 소스를 받는다.
이 소스 컴파일을 위해서는 libattr-devel 패키지가 설치되어 있어야 한다.
2) setcap명령으로 CAP_NET_BIND_SERVICE를 1024 이하 포트를 사용할 파일명에 설정해주면 된다. 심볼릭 링크 파일은 지정할 수가 없다.
3) 설정을 확인하려면 getcap을, 그리고 설정을 다시 빼려면 -r 옵션을 사용하면 된다.
[ 명령 형식 ] setcap capability1[,capability2][=-+][value] <filename>
### 테스트를 위해 nc명령을 사용 $ setcap 'cap_net_bind_service=+ep' /usr/bin/nc $ getcap /usr/bin/nc /usr/bin/nc = cap_net_bind_service+ep ### 설정 빼기 $ setcap -r /usr/bin/nc $ getcap /usr/bin/nc
capabilities 이름인 cap_net_bind_service는 대소문자 구별이 없지만, set 해당하는 ep는 소문자만 사용해야 한다.
연산자는 +, -, = 3가지로, chmod의 연산자와 동일한 의미가 있다. 각각 추가(+), 삭제(-), 지정한 권한으로 동일(=)하게 변경한다.
file capabilities set에는 다음 3가지가 있다.
- e : effective -> 효력 부여
- p : Permitted -> 허용
- i : Inheritable -> exec 할 때 권한 상속 여부
capabilities manpage에서 각 set에 대한 자세한 설명 하고 있다. 파일에 cap_net_bind_service 권한을 부여하려면 ep 또는 eip를 셋팅하면 된다는 것만 알고 있으면 된다.
다음은 999 포트를 오픈한 예이다. 일반 유저로 실행된 것을 확인할 수 있다.
[일반 유저가 999포트 바인딩]
[root로 확인]$ nc -l 999 (데비안 또는 우분투에서는 nc -l -p 999)
$ netstat -anp Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:999 0.0.0.0:* LISTEN 18021/nc <--- 999포트를 18021 PID가 ... 생략 ...
$ ps auxww|grep "[n]c " coffeenix 18021 0.0 0.0 1728 612 pts/15 S+ 18:59 0:00 nc -l 999 <--- 18021 PID 실행유저는 coffeenix
4. Linux에서 capabilities 좀더 알기
1) PAM 모듈
pam_cap.so PAM 모듈도 제공하므로, 로그인하거나 su 이용 시 '유저별'로 다른 권한을 부여할 수 있다.
/etc/security/capability.conf 에 capabilities를 설정한다.
CentOS에서 libcap2 소스를 가져다 PAM 모듈을 설치할 경우 먼저 pam-devel 패키지가 설치되어 있어야 한다.
2) 프로세스의 capabilities set 상태 확인
capabilities의 Effective/Inheritable/Permitted set(집합)은 각각 32bit로 이뤄져 있다. 그리고, 각 bit 별로 어떤 권한(자격)을 갖는지 지정되어 있다. CAP_NET_BIND_SERVICE 은 11번째 bit(0100 0000 0000 => hex 0400)에 해당한다. 나머지 권한들이 몇 번째 bit인지는 /usr/include/linux/capability.h에 자세히 나와 있으니 생략한다.
프로세스의 capabilities set 상태 확인해보자. setcap으로 설정해둔 프로그램을 실행한다. 그리고 해당 프로세스의 PID를 확인한다. cat /proc//status|grep Cap 명령으로 bitmap 결과를 확인할 수 있다.
$ cat /proc/26494/status|grep cap CapInh: 0000000000000000 <-- Inheritable capabilities CapPrm: 0000000000000400 <-- Effective capabilities (Hex 0400. 즉, CAP_NET_BIND_SERVICE이 set되었음을 확인할수 있다.) CapEff: 0000000000000400 <-- Permitted capabilities (Hex 0400) CapBnd: ffffffffffffffff
설정
setcap 'cap_net_bind_service=+ep' /usr/bin/nc
설정 확인
getcap /usr/bin/nc
$ getcap /usr/bin/nc
/usr/bin/nc = cap_net_bind_service+ep
해지
setcap -r /usr/bin/nc
설정 확인
getcap /usr/bin/nc
참고URL
- 커피닉스 : 일반유저가 1024이하 포트를 사용하려면
'리눅스' 카테고리의 다른 글
Oracle 리스너를 설정하는 방법 (0) | 2014.09.29 |
---|---|
리눅스에서 패스워드를 한 줄로 변경하기 (0) | 2014.09.25 |
오라클 데이터베이스를 시작하고 중지하는 방법 (0) | 2014.09.24 |
오라클 데이터베이스에서 Tablespace를 생성, 변경, 추가하고 사용자를 생성하고 권한을 부여하는 방법 (0) | 2014.09.24 |
[오라클][INS-20802] Oracle Net Configuration Assistant failed. (0) | 2014.09.23 |