강좌
클라우드/리눅스에 관한 강좌입니다.
해킹&보안 분류

리눅스보안강좌#3: suid/sgid 파일 점검

작성자 정보

  • 관리자 작성
  • 작성일

컨텐츠 정보

본문

suid/sgid 파일 점검

 

일반 유저 권한으로 suid/sgid가 설정된 파일을 실행할 때에는 해당 파일의 소유자 또는 소유그룹 권한으로 작동하게 되므로 suid/sgid는 보안적인 관점에서 매우 중요한 역할을 한다. 이 때문에 /usr/sbin/sendmail과 같이 전통적으로 root 권한의 suid/sgid가 설정된 파일에서 보안 취약성이 많이 발견된 것이 사실이다.

 

따라서 초기 시스템 구축 시 뿐만 아니라 정기적으로 시스템에서 suid/sgid가 설정된 파일을 모니터링 하여 suidsgid가 불필요하다면 파일 자체를 삭제 하거나 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)

- bashcsh등 로그인시 실행되는 쉘을 변경하는 명령어인데, 쉘을 변경할 필요 가없다면 필요 없다.

 

/usr/bin/newgrp (suid)

- 새로운 그룹으로 로그인하는 명령어인데, 잘 사용되지 않으므로 역시 필요 없다.

 

/usr/bin/write (sgid)

- talk와 같이 다른 유저에게 메시지를 보내는 명령어인데, 서버 운영 시 잘 사용되 지 않고 필요도 없다.

 

/usr/bin/at (suid)

- atcron과 같이 반복적인 작업을 하고자 할 때 사용되는데, 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 관련 명령어를 소개하고자 한다. 비단 시스템 관리뿐만 아니라 해킹당한 시스템을 분석하기 위한 보안상의 목적으로도 사용될 수 있을 것이다.

 

 

# find ./ -name "*" -exec grep -H hack {} \;

# find ./ -type f -print | xargs grep -H "hack" /dev/null

# find ./ type f -exec grep 'hack' {} /dev/null \;

# egrep -r hack *

위 명령어들은 현재 디렉토리에서부터 하위 디렉토리까지 내려가면서 파일 내 hack이라는 문자가 포함된 파일을 찾아준다.

 

사용될 일이 많기 때문에 한 가지 정도는 외워두는 것도 좋은데, 필자는 세 번째 명령어를 자주 사용한다.

 

#find / -user 427 -print

 

위의 예는 전체 디렉토리에서 소유자의 uid427인 파일들을 보여준다.

 

 

# find / -cmin -5

 

위의 예는 최근 5분 안에 생성되거나 업데이트 된 파일들을 보여준다.

 

 

# find / -perm -0002 -type d -print

 

위의 예는 일반 유저가 쓰기 권한이 있는 디렉토리(directory)를 보여준다.

 

 

 

# find / -perm -0002 -type f -print

 

위의 예는 일반 유저가 쓰기 권한이 있는 파일(file)을 보여준다.

 

 

# find / -nouser -o -nogroup -print

 

위의 예는 유저나 그룹이 없는 파일을 보여준다.

 

 

 

# find / -mtime 2 -o -ctime 2

 

위의 예는 지난 2일 사이에 변경된 파일을 보여준다.

 

 

 

만약 한 디렉토리에 파일이나 디렉토리가 많을 경우에 findls, 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

 

 

강사 : 홍석범부매니저  소속: 라쿠텐

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,040 명
  • 현재 강좌수 :  35,853 개
  • 현재 접속자 :  165 명