[Linux] TCP Wrapper를 이용한 ip별 접근제어 설정

2022. 8. 5. 15:08Linux/Basic

반응형

1. TCP Wrapper?

네트워크 서비스(= 데몬)에 대한 호스트 기반의 접근 제어 시스템(= Access Control List)으로, 래핑된 네트워크를 서비스에 연결하는 것을 허용하거나 허용하지 않을 것을 ip나 도메인의 정의를 통해 관리합니다.

tcp wrapper로 관리되는 서비스 중 하나가 바로 xinetd 슈퍼 데몬입니다.

xinetd 는 네트워크 서비스 하위 집단에 대한 연결을 제어하는 슈퍼 데몬입니다.


TCP Wrapper가 작동되는 위치에 대해서는 아래 Red Hat Docs에서 제공하는 그림을 보면 더 쉽게 알 수 있습니다.

02-9

Figure 2.4. Reference

인터넷 네트워크를 통해 들어온 요청들은 먼저, 방화벽을 거치고
방화벽을 통과한 요청들 중에 TCP Wrapper를 통해 허용할 IP를 거릅니다.
xinetd 슈퍼 데몬도 TCP Wrapper에서 서비스하고 있는 데몬 중 일종으로, TCP Wrapper에 의한 접근제어가 가능합니다.


TCP Wrapper는 기본적으로 설치되어있는데, 구성 요소 중 가장 중요한 것이 바로 libwrap.so 라이브러리 입니다. TCP Wrapper로 래핑된 서비스는 libwrap.so 라이브러리에 대해 컴파일된 서비스입니다. (그 예로는 /usr/sbin/sshd, /usr/sbin/xinetd, /usr/sbin/snmpd 등이 있습니다.)

네트워크 서비스 관련 데몬에 libwrap.so 라이브러리가 링크되어있는지 확인하고 싶다면 ldd 명령어를 사용하면 됩니다.

ldd /usr/sbin/sshd | grep libwrap.so
        libwrap.so.0 => /lib64/libwrap.so.0 (0x00007fd48ef96000)

TCP Wrapper는 libwrap 공유 라이브러리를 사용하거나, 또는 xinetd 슈퍼 데몬에 의해 관리되고 있는 네트워크 서비스에 대한 설정이 가능합니다.
그에 대한 예시로는 ssh, xinted, telnet, finger, ftp, exec, rsh, rlogin, tftp, talk, comsat 등이 있습니다.

서비스들은 호스트 access 파일인 /etc/hosts.deny, /etc/hosts.allow 에 쓰여진 규칙에 의해 네트워크 서비스 프로세스별로 접근을 제어할 수 있습니다.
네트워크 접근 시 syslogd 를 통해 client 정보나 서비스명, 접속시간 등에 대한 기록을 /var/log/secure/var/log/messages 에 남깁니다.


2. access control rules

daemon_list : client_list [ : shell_command ]
  • daemon_list
    • 하나 또는 하나 이상의 데몬 프로세스명이나 wildcard
  • client_list
    • 하나 또는 하나 이상의 host address(or host name)이나 wildcard나 pattern
    • daemon@host, user@host 같은 복잡한 형태도 작성할 수 있습니다.
  • shell_command
    • spawn
      • 쉘 명령을 자식 프로세스로 실행합니다.
    • twist
      • 요청된 서비스를 지정된 명령으로 바꿉니다.
      • 보통, 연결된 client에게 메시지를 보내는데에 이용합니다.

2.1. 작성 규칙

같은 데몬에 대해서 여러줄로 작성해도 되고,

sshd : 192.168.200.
sshd : 10.0.1.

한줄로 작성해도 됩니다.

sshd : 192.168.200., 10.0.1.

데몬도 같은 client에 대해 여러줄로 표기해도 되고,

sshd : 192.168.200.
in.telneted : 192.168.200.

한줄에 여러개 써도 됩니다.

sshd, in.telneted : 192.168.200.

2.2. daemon_list 및 client_list 작성 예시

/etc/hosts.allow파일에 설정하는 rule들에 대한 간단한 예시를 통해 Access Rule을 정의하는 방법을 알아보도록 합시다.
(shell_command에 관련된 설명은 실전 예제에서 다루겠습니다.)

sshd 서비스를 160.251.74.196 ip를 가진 클라이언트에게 허가합니다.

sshd : 160.251.74.196

모든 서비스를 ip가 192.168.200.로 시작하는 클라이언트에게 허가합니다.

ALL : 192.168.200.

sshd, in.telnetd(텔넷) 서비스를 applebox.xyz 도메인을 가진 클라이언트에게 허가합니다.

sshd, in.telneted : .applebox.xyz

client_list 구문에 EXCEPT를 사용하면 특정 ip또는 도메인을 제외할 수 있습니다. sshd, in.telneted: .applebox.xyz EXCEPT demo.applebox.xyz


모든 서비스를 LOCAL 서버에서 접근을 허가합니다.

ALL: LOCAL

3. 설정

/etc/hosts.deny 파일은 서비스 데몬별로 접근을 허용하지 않을 client를 등록하는 곳이고, etc/hosts.allow 는 접근을 허용할 client를 등록하는 곳입니다.

간단히 표현하자면, hosts.deny는 black list, hosts.arrow는 white list라고 볼 수 있는데
보안 설정에서는 기본적으로 모든 접근을 막은 후, 특정 몇몇 client에 대해서 접근을 허용하는 화이트 리스트 기반이 관리 측면에서 더 효율적입니다.

3.1. hosts.deny

아래의 2가지 규칙에 맞춰 deny 기본값을 설정합니다.

  1. sshd 접속의 경우, 기본적으로 deny하며, 현재 날짜 + ' access denied to ' + host주소/var/log/sshd.log에 기록합니다.
  2. 나머지 네트워크 데몬 서비스는 기본적으로 모두 deny 하면서, ABC server access deined 메시지를 echo합니다.
sudo vim /etc/hosts.deny
sshd : ALL : spawn /bin/echo `/bin/date` access denied to %h>>/var/log/sshd.log
ALL : ALL : twist /bin/echo "ABC server access denied"

만일 sshd 이외에도 기본적인 거부 규칙을 작성하고 싶다면 ALL : ALL 위에 규칙을 작성하면 됩니다.


3.2. hosts.allow

접근 허용할 호스트를 hosts.allow 파일에 추가해줍니다.

  1. 로컬의 경우 모든 네트워크 서비스의 접근을 허가합니다.
  2. sshd 접속의 경우, 160.251.74.196, 59.6.230.229 ip의 접속을 허가하며 , 현재 날짜 + ' from ' + host주소/var/log/sshd.log에 기록합니다.
  3. telnet 접속의 경우, 160.251.74.196 ip의 접속을 허가하며 , 현재 날짜 + ' from ' + host주소/var/log/telnet.log에 기록합니다.
sudo vim /etc/hosts.allow
ALL : LOCAL
sshd : 160.251.74.196, 59.6.230.229 : spawn /bin/echo `/bin/date` from %h>>/var/log/sshd.log
in.telnetd : 160.251.74.196 : spawn /bin/echo `/bin/date` from %h>>/var/log/telnet.log

4. 접속 테스트

4.1. telnet

hosts.allow에 등록하지 않은 client에서 telnet 접속 시도 시, 아래와 같이 연결 거부되며, "ABC server access deined" 메시지를 출력합니다.

02-8


hosts.allow 에 등록된 client에서 telnet 접속시 아래와 같이 연결이 성공되며,

02-7

/var/log/telnet.log에는 아래와 같이 접속 로그가 추가되었습니다.

Fri Aug 5 05:35:32 GMT 2022 from 160.251.74.196

4.2. sshd

hosts.allow 에 등록되지 않은 client가 sshd 접속 시도할 경우 /var/log/sshd.log 에 아래와 같은 log를 기록하며 연결 거부되고

Fri Aug 5 05:05:48 GMT 2022 access denied to 130.162.146.82

등록된 client로 접속 시도할 경우 아래와 같은 로그를 남기며 연결이 성공됩니다.

Fri Aug 5 05:06:07 GMT 2022 from 160.251.74.196

5. 기타

ls -al /var/log | egrep -i '(secure|messages)'
-rw-------   1 root   root     1366836 Aug  5 05:40 messages
-rw-------   1 root   root      174792 Jul 10 03:42 messages-20220710
-rw-------   1 root   root      168726 Jul 17 03:39 messages-20220717
-rw-------   1 root   root      146800 Jul 24 03:12 messages-20220724
-rw-------   1 root   root      144922 Jul 31 03:13 messages-20220731
-rw-------   1 root   root      819974 Aug  5 05:40 secure
-rw-------   1 root   root     2565589 Jul 10 03:40 secure-20220710
-rw-------   1 root   root     2342424 Jul 17 03:38 secure-20220717
-rw-------   1 root   root     4863832 Jul 24 03:11 secure-20220724
-rw-------   1 root   root     2157632 Jul 31 03:08 secure-20220731

/var/log/secure 에는 아래와 같은 접속 로그들이 남습니다.

Aug  5 05:57:28 abc sshd[27256]: Accepted publickey for jini from 160.251.74.196 port 45030 ssh2: RSA SHA256:9rPElCkMTN7kSOjy+3BnJ6YLRdlPUS0LZ4urTxmTWLs
Aug  5 05:57:28 abc sshd[27256]: pam_unix(sshd:session): session opened for user jini by (uid=0)
Aug  5 05:57:33 abc sshd[27263]: Received disconnect from 160.251.74.196 port 45030:11: disconnected by user
Aug  5 05:57:33 abc sshd[27263]: Disconnected from 160.251.74.196 port 45030
Aug  5 05:57:33 abc sshd[27256]: pam_unix(sshd:session): session closed for user jini

sshd로 jini 사용자라 접속 성공 후 종료 한 로그

Aug  5 05:53:40 abc sudo: pam_unix(sudo:session): session closed for user root
Aug  5 05:53:42 abc sudo:    coco : TTY=pts/0 ; PWD=/home/coco ; USER=root ; COMMAND=/bin/vim /var/log/secure
Aug  5 05:53:42 abc sudo: pam_unix(sudo:session): session opened for user root by coco(uid=0)

telnet으로 coco 사용자가 접속 성공 후 종료한 로그


/var/log/messages에도 아래와 같은 twist 명령 등이 로그에 남습니다.

Aug  5 05:30:33 abc xinetd[11699]: START: telnet pid=19614 from=::ffff:130.162.146.82
Aug  5 05:30:33 abc xinetd[19614]: twist 130.162.146.82 to /bin/echo "ABC server access denied"
Aug  5 05:30:33 abc xinetd[11699]: EXIT: telnet status=0 pid=19614 duration=0(sec)
Aug  5 05:33:45 abc xinetd[11699]: START: telnet pid=20459 from=::ffff:160.251.74.196
Aug  5 05:33:49 abc xinetd[11699]: EXIT: telnet status=0 pid=20459 duration=4(sec)

관련된 자세한 설정은 설정에 따라 로그에 기록되는 정보가 달라지니 참고 바랍니다.


+++

  • 보안 취약점 SRV-027 서비스 접근 IP 및 포트 제한 미비
  • TCP Wrappers configuration files

++ References

728x90
반응형

'Linux > Basic' 카테고리의 다른 글

[Oracle Linux 8] alternative를 이용한 JDK 버전 변경  (0) 2022.02.18