Linux에서 일반 계정으로 LDAP 389 port를 실행하는 방법

본 포스팅은 CentOS 7 Linux에서 389 포트를 사용하는 LDAP  프로세스를  일반 계정으로 LISTEN 하는 방법에 대해 기술합니다.

독자 분들의 이해를 돕기 위해 Java 기반의 오픈소스 LDAP인 OpenDJ를 예시로 설명하였습니다.

Open Source LDAP 정리

LDAP이 아니더라도 Linux 일반 계정으로 잘 알려진 포트(Well-known Port)를 LISTEN 해야 하는 모든 어플리케이션에 공통적으로 적용됩니다.

IANA TCP/UDP 포트 분류 기준 권고안 (참고 링크)

Well-known Port(0번 ~ 1023번): HTTP는 80번, SSH는 22번 포트와 같이 자주 사용되는 서비스에 기본 값으로 할당한 포트입니다.

Registered Port(1024번 ~49151번): 주로 서버에서 프로세스에 포트 바인딩 시 사용하는 포트입니다.

Dynamic Port(49152번 ~ 65535번): 주로 클라이언트가 서버와 소켓 통신을 할 때 서버에서 패킷을 수신을 받기 위해 임의로 부여되는 포트입니다.

 

CentOS 7 Linux는 root 계정이거나 CAP_NET_BIND_SERVICE 권한이 있는 경우에만 Well-known Port를 LISTEN 할 수 있도록 시스템 커널 변수를 통해 권한이 설정되어 있습니다.

우선 시스템에 기본 값으로 할당된 Well-known Port 범위를 확인합니다.

커널 변수 ip_unprivileged_port_start는 root 또는 CAP_NET_BIND_SERVICE 권한이 없어도 LISTEN 할 수 있는 첫 번째 포트를 지정합니다. 기본 값은 1024 입니다. root 계정이거나 CAP_NET_BIND_SERVICE 권한이 있는 경우 0번 ~ 1023번 포트를 LISTEN 할 수 있는 권한을 가지며, 일반 계정은 1024번 이후의 포트만 LISTEN 할 수 있습니다.

그렇기 때문에 일반 계정으로 LDAP 프로세스를 실행하기 위해서는 LDAP 기본 포트인 389 포트가 아닌 1024번 이후의 포트로 LDAP을 LISTEN 하도록 설정해야 합니다.

본 예제에서는 ldap 계정을 통해 1389 포트로 LDAP을 LISTEN 하고 있습니다. 참고로 같이 조회된 4444 포트는 OpenDJ 내부 관리용 포트입니다.

현재 LISTEN 중인 1389 포트를 389 포트로 변경하고 ldap 계정으로 재 시작하면 권한이 없기 때문에 다음과 같은 메시지가 출력되며 강제로 프로세스 기동이 중단됩니다.

LDAP을 389 포트로 기동시킬 수 있는 몇 가지의 해결 방안이 있으며 상황에 따라 적용하시면 됩니다.

1. root 계정 사용

2. firewalld 포트포워딩 설정

3. 커널 변수 값 변경

4. capabilities 설정

 

1. root 계정 사용

말 그대로 root 계정의 사용이 가능한 경우 root 계정으로 LDAP 프로세스를 기동하는 것을 의미합니다. 다만 무분별한 root의 사용은 보안상 다양한 취약점을 발생시킬 수 있으므로 권장하지 않는 방법입니다.

 

2. firewalld 포트포워딩 설정

CentOS 7 네트워크 방화벽인 firewalld를 통한 포트포워딩 설정을 수행합니다. 단, 시스템 내부에 LISTEN 되는 포트를 변경하는 방법은 아니므로 참고해주시기 바랍니다.

보안상으론 좋은 방법이지만 별도의 방화벽 관리가 필요하기 때문에 만약 방화벽 자체에 문제가 생길 경우 LDAP 서비스가 안 되는 상황이 생길 수 있습니다.

또한 LDAP 서비스 관리 시 내부와 외부 포트가 서로 다르기 때문에 LDAP 복제 구성을 하거나 시스템 내/외부적으로 LDAP 포트를 참조하는 프로그램을 사용하는 등의 일부 상황에서 제약 사항이 발생할 수도 있습니다.

우선 root 계정으로 시스템에서 firewalld 서비스가 실행 중인지 확인합니다.

현재 실행 중이 아닌 경우 firewalld 서비스를 실행합니다.

방화벽 정책은 아래의 명령어를 통해 확인하실 수 있습니다.

포트포워딩 설정을 진행합니다.

포트포워딩 설정을 진행하면 시스템 외부의 사용자는 389 포트로 LDAP에 접속할 수 있습니다. 다만 firewalld 서비스가 실행 상태가 아니면 포트포워딩을 하지 않기 때문에 시스템에 LISTEN 중인 LDAP 포트로 접속해야 하는 상황이 생길 수 있으므로 관리 시 주의가 필요합니다.

 

3. 커널 변수 값 변경

커널 변수 ip_unprivileged_port_start 값을 0으로 변경하면 Well-known Port의 LISTEN이 가능합니다.

쉬운 방법이지만 시스템의 커널 변수를 변경하면 보안에 악영향을 줄 수 있습니다. 공격자에게 다양한 공격 수단을 쥐어주는 행위이므로 권장하지 않는 방법입니다.

 

4. capabilities 설정

가장 안전한 방법은 root 계정으로 Java에 CAP_NET_BIND_SERVICE 권한을 부여하고 일반 계정으로 LDAP을 기동하는 방법입니다. OpenDJ는 JVM에서 동작하므로 실제로 포트 바인딩을 수행하는 Java 실행 파일에 권한을 부여해야 합니다.

Java 실행 파일에 권한이 부여되었는지 확인합니다.

setcap 명령어를 통해 권한을 부여한 이후 LDAP 기동 시 아래와 유사한 에러 메시지가 발생할 수 있습니다.

이 경우 터미널에서 java를 실행하면 아래의 에러 메시지가 출력되는 것을 확인할 수 있습니다.

/etc/ld.so.conf.d/java.conf 파일에 libjli.so 파일의 절대 경로를 입력하여 Java가 해당 라이브러리를 참조할 수 있도록 조치합니다.

이제 다시 일반 계정으로 LDAP을 기동하면 정상적으로 기동이 수행됩니다.

 

 

 

 


답글 남기기