리눅스보안강좌#3: suid/sgid 파일 점검
작성자 정보
- 관리자 작성
- 작성일
컨텐츠 정보
- 8,262 조회
- 0 추천
- 목록
본문
suid/sgid 파일 점검
일반 유저 권한으로 suid/sgid가 설정된 파일을 실행할 때에는 해당 파일의 소유자 또는 소유그룹 권한으로 작동하게 되므로 suid/sgid는 보안적인 관점에서 매우 중요한 역할을 한다. 이 때문에 /usr/sbin/sendmail과 같이 전통적으로 root 권한의 suid/sgid가 설정된 파일에서 보안 취약성이 많이 발견된 것이 사실이다.
따라서 초기 시스템 구축 시 뿐만 아니라 정기적으로 시스템에서 suid/sgid가 설정된 파일을 모니터링 하여 suid나 sgid가 불필요하다면 파일 자체를 삭제 하거나 s비트를 해제하는 것이 좋다.
# find / -type f \( -perm -4000 -o -perm -2000 \) |
또는
# find / -type f -perm +6000 -ls |
먼저 위의 명령어를 실행하여 전체 시스템 내(/)에서 suid(4000)나 sgid(2000)가 설정된 파일을 검색하도록 한다. 배포판이나 버전에 따라 결과는 조금씩 다를 수는 있지만 일반적으로 다음과 같은 결과가 보일 것이다.
위 명령의 결과로 출력되는 각각의 파일에 대해 간단히 살펴보자.
/usr/bin/chage (suid)
- chage는 유저의 암호 만기일 정보를 변경하거나 조회하는 명령어인데,
root만 사용하면 되므로 suid가 설정될 필요 없다.
/usr/bin/gpasswd (suid)
- /etc/group이나 /etc/gshadow 파일을 관리할 때 사용되는 명령어인데 잘 사용되지 않으므로 굳이 설정할 필요 없다.
/usr/bin/wall (sgid)
- 터미널에 연결되어 있는 유저들에게 메시지를 보내고자 할 때 사용되는데,
실제 서버를 이용 시 사용될 이유가 없으므로 해제하는 것이 좋다.
/usr/bin/chfn (suid)
- finger로 질의 시 보이는 정보를 변경하는 명령어인데, finger 자체가 보안 문제등 으로 잘 사용되지 않으므로 필요 없다.
/usr/bin/chsh (suid)
- bash나 csh등 로그인시 실행되는 쉘을 변경하는 명령어인데, 쉘을 변경할 필요 가없다면 필요 없다.
/usr/bin/newgrp (suid)
- 새로운 그룹으로 로그인하는 명령어인데, 잘 사용되지 않으므로 역시 필요 없다.
/usr/bin/write (sgid)
- talk와 같이 다른 유저에게 메시지를 보내는 명령어인데, 서버 운영 시 잘 사용되 지 않고 필요도 없다.
/usr/bin/at (suid)
- at는 cron과 같이 반복적인 작업을 하고자 할 때 사용되는데, at 자체가
cron에 비해 보안 결함이 있고 잘 사용되지 않으므로 필요 없다.
/usr/sbin/usernetctl(suid)
- 일반 유저가 인터페이스를 제어하도록 하는 명령어인데, 허용할 필요가 없 으므로 필요 없다.
/usr/sbin/userhelper (suid)
- GUI를 통해 암호를 관리하고자 할 때 필요한데, 서버 운영 시 GUI 자체가 보안 상 문제가 될 수 있으므로 필요 없다.
/bin/mount (suid)
- 파일 시스템을 마운트 하고자 할 때 필요한데, 일반 유저에게 마운트 권한을 줄 필요가 없으므로 필요 없다.
/bin/umount (suid)
- 파일 시스템을 언마운트 하고자 할 때 필요한데, 일반 유저에게 언마운트 권한을 줄 필요가 없으므로 필요 없다.
/usr/sbin/lockdev (sgid)
- devices를 잠글 때 필요하며 lock이라는 그룹 권한으로 설정되어 있는데,
그대로 두는 것이 좋다.
/bin/ping (suid)
- ping은 잘 알고 있듯이 icmp echo request 패킷을 발송하는 것으로
일반 유저에게 ping을 허용하려면 suid를 그대로 유지하고 일반유저에게 ping을 금지하려면 suid를 해제하면 된다.
. 만약 4755 대신 0755로 설정한 상태에서 일 반 유저가 ping을 실행하면 아래와 같은 에러가 나게 된다.
.
ping: icmp open socket: Operation not permitted
/usr/sbin/traceroute (suid)
- traceroute는 네트워크 경로를 추적하는 명령어로서 일반 유저에게 traceroute 를 허용하려면 suid를 그대로 유지하고, 금지하려면 suid를 해제하면 된다.
.
/usr/bin/passwd (suid)
- suid가 설정된 파일 중 가장 많이 사용되는 명령어일 것이다.
일반 유저가 자 신의 암호를 변경하려면 /etc/shadow 파일을 읽고 쓸 수 있는 권한이 있어야 하는데, 이는 root 권한만이 가능하므로 passwd 파일은 root 소유의 suid가 설정되어 있어야 한다. 따라서 이 파일의 퍼미션을 755등으로 변경하면 오직 root만이 암호를 변경할 수 있게 된다.
.
/usr/bin/crontab (suid)
- 일반 유저가 cron을 설정하여 사용하도록 허용할 경우에는 suid가 필요하지만
일반 유저가 cron을 사용할 수 없도록 제한할 경우에는 불필요하다.
이후 suid가 설정된 파일에서 s 비트를 해제하는 명령어는 아래와 같다.
# chmod u-s /usr/sbin/suid_file |
위는 user에 설정된 s 비트를 해제(-)하는 명령어이고, 만약 s 비트를 설정하려면 -s 대신 "chmod u+s"를 실행하면 된다.
. 또는 s 비트를 해제하려면 아래와 같이 4xxx 대신 0xxx 또는 0을 빼고 실행해도 된다.
.
# chmod 0700 /usr/sbin/suid_file 또는 chmod 700 /usr/sbin/suid_file |
같은 방법으로 sgid가 설정된 파일에서 s 비트를 해제하는 명령어는 아래와 같다.
# chmod g-s /usr/sbin/sgid_file |
위는 group에 설정된 s 비트를 해제(-)하는 명령어이고, 만약 s 비트를 설정하려면 -s 대신 "chmod g+s"를 실행하면 된다.
. 또는 s 비트를 해제하려면 아래와 같이 2xxx 대신 0xxx 또는 0을 빼고 실행해도 된다.
.
# chmod 0700 /usr/sbin/sgid_file 또는 chmod 700 /usr/sbin/sgid_file |
????[유용한 팁]
[ find와 관련된 유용한 명령어 ]
find가 나온 김에 알고 있으면 좋을 몇 가지 유용한 find 관련 명령어를 소개하고자 한다. 비단 시스템 관리뿐만 아니라 해킹당한 시스템을 분석하기 위한 보안상의 목적으로도 사용될 수 있을 것이다.
위 명령어들은 현재 디렉토리에서부터 하위 디렉토리까지 내려가면서 파일 내 hack이라는 문자가 포함된 파일을 찾아준다.
사용될 일이 많기 때문에 한 가지 정도는 외워두는 것도 좋은데, 필자는 세 번째 명령어를 자주 사용한다.
위의 예는 전체 디렉토리에서 소유자의 uid가 427인 파일들을 보여준다.
위의 예는 최근 5분 안에 생성되거나 업데이트 된 파일들을 보여준다.
위의 예는 일반 유저가 쓰기 권한이 있는 디렉토리(directory)를 보여준다.
위의 예는 일반 유저가 쓰기 권한이 있는 파일(file)을 보여준다.
위의 예는 유저나 그룹이 없는 파일을 보여준다.
위의 예는 지난 2일 사이에 변경된 파일을 보여준다.
|
만약 한 디렉토리에 파일이나 디렉토리가 많을 경우에 find나 ls, rm등을 실행하면 “Argument list too long”과 같은 에러가 나오게 되는데 이는 buffer의 크기가 한정되어 있기 때문이다.
[root@server /root]# getconf ARG_MAX 131072
이는 /usr/include/linux/limits.h 파일에 ARG_MAX 값이 정의되어 있으므로 hard kernel tuning을 하여야 가능하다. --------------------------------------------------- #ifndef _LINUX_LIMITS_H #define _LINUX_LIMITS_H
#define NR_OPEN 1024
#define NGROUPS_MAX 65536 /* supplemental group IDs are available */ #define ARG_MAX 131072 /* # bytes of args + environ for exec() */
이러한 경우 굳이 소스를 수정할 필요 없이 아래와 같이 xargs를 이용하면 가능하다. 즉, # ls -la * ==> 의 경우 # find . | xargs ls -la 와 같이 실행하면 되고,
# rm -f `find -type f -exec grep "[SPAM]" /dev/null {} \; | cut -f 1 -d ":"` 의 경우 아래와 같이 실행하면 된다.
. # find -type f -exec grep "$CON" /dev/null {} \; | cut -f 1 -d ":" | xargs rm -f
|
강사 : 홍석범부매니저 소속: 라쿠텐
관련자료
-
이전
-
다음