본문 바로가기

리눅스

[리눅스] 일반유저가 1024 이하 포트를 사용하기(setcap/getcap)

728x90

일반유저가 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포트 바인딩]
$ nc -l 999 (데비안 또는 우분투에서는 nc -l -p 999)​
[root로 확인]
$ 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이하 포트를 사용하려면

 

728x90