1/13/2007

[Linux] File System Security(Linux Server Security)

1. mount



- mount는 파일시스템 구조 내에 있는 일련의 파일들을 사용자나 사용자 그룹들이 이용할 수 있도록 만드는 것이다. 디바이스와 디렉토리를 연결해주는 작업을 한다. 부팅시 커널은 /etc/fstab 파일을 읽어서 마운트 할 디바이스를 찾고 이 디바이스들을 fstab 파일에 명시된 디렉토리에 마운트시킨다.

- mount 명령의 사용법 : mount 명령은 2개의 인수를 취한다. 첫 번째 인수는 파일시스템을 포함하고 있는 디스크나 파티션에 해당되는 장치파일이다. 두 번째 인수는 마운트될 디렉토리이다.

# mount /dev/sda2 /usr
# mount /dev/sda8 /home


mount [-lhV]

mount -a [-fFnrsvw] [-t vfstype] [-O optlist]
mount [-fnrsvw] [-o options [,...]] device dir
mount [-fnrsvw] [-t vfstype] [-o options] device dir

- mount 명령은 여러 가지 옵션이 존재하는데 그 중에서 꼭 알아두어야 할 옵션은 -t 와 -o 옵션이다.

-t 옵션 뒤에는 파일 시스템의 타입을 써주어야 한다.
-o 옵션은 뒤에 나올 fstab 파일의 옵션 부분에 들어갈 옵션들을 적어준다. 옵션은 다음과 같다.

async : 파일 시스템에 대한 I/O가 비동기적으로 이뤄지도록 한다.
auto : -a 옵션으로 마운트 가능하게 한다.
defaults : 다음과 같은 기본 옵션을 사용하게 한다. (rw, suid, dev, exec, auto, nouser, async)
Dev : 파일 시스템상의 문자, 블럭 특수장치를 해석한다.
exec : 바이너리의 실행은 허가한다.
noauto : 명시적으로만 마운트 가능하다.(즉,-a 옵션으로는 마운트되지 않는다.)
nodev : 파일 시스템상의 문자, 블럭 장치에 대한 해석을 하지 않는다.
noexec : 마운트된 파일 시스템 상의 어떤 바이너리도 실행을 허가하지 않는다. 자신이 지원하지 않는 바이너리를 포함하는 파일 시스템에 대해 유용하다.
nosuid : setuid, setgid를 무시한다.
nousers : 일반 사용자가 마운트할 수 있도록 허용하지 않는다. 기본 설정값이다.
remount : 이미 마운트된 파일 시스템을 다시 마운트한다. 보통 읽기 전용 파일 시스템을 읽기/쓰기 모드로 전환하는 등 파일 시스템에 대한 플래그를 바꿀 때 사용된다.
Ro : 파일 시스템을 읽기만 가능하게 한다.
Rw : 읽기/쓰기 모두 가능하게 마운트한다.
suid : setuid, setgid가 효력을 발휘할 수 있게 해준다.
sync : 파일 시스템에 대한 I/O가 동기적으로 이뤄지게 한다.
user : 일반 사용자도 마운트 할 수 있게 허용한다. 이 옵션은 다음 noexec, nosuid, nodev도 효력을 발휘하게 한다.(같은 줄에서user, exec, dev, suid 등의 옵션을 주지 않는다면)

- 만약 fstab 파일이 잘못 설정되어 있으면 부팅이 안될 수도 있고 보안상 치명적이 결과를 초래할 수도 있다.

- fstab 파일의 형태는 다음과 같다.

LABEL=/usr /usr ext3 defaults 1 2
(filesystem)(directory)(type)(options)(frequency)(pass)

- 첫 번째 필드는 파일 시스템을 나타낸다. 즉, 물리적인 디바이스를 나타내는데 레드햇 9에서는 LABEL로 대체해서 쓰고 있다. 보통 많이 볼 수 있는 형태는 /dev/sda2 이다.
- 두 번째 필드는 파일 시스템을 마운트 할 디렉토리를 지정한다. 즉, 마운트포인트가 된다.
- 세 번째 필드는 파일 시스템의 타입이다.
- 네 번째 필드 부분은 옵션이다.
- 다섯 번째, 여섯 번째 필드는 백업 주기와 fsck에 넘겨주는 값으로 부팅시 fsck로 체크할 것인지 안 할 것인지를 나타낸다. 0은 체크를 안 한다는 뜻이다.

- 여기서 보안상 문제가 발생할 수 있는 부분은 옵션부분이다.

- ex)공격자가 웹 서버의 취약점을 이용하여 시스템에 침입하였을 경우 대부분의 공격자는 /tmp 디렉토리에 로컬에서 권한 상승에 필요한 파일들을 다운로드 한다. 이런 파일들은 setuid 비트가 설정된 파일도 있고 실행이 되는 파일들이다. 만약 다음과 같이 설정되어 있다면 이런 공격들이 통하지 않을 것이다.

LABEL=/tmp /tmp ext3 defaults,nosuid,noexec 1 2

- 그리고 /home 디렉토리에 setuid 파일이나 device 파일은 존재하지 않아도 사용자들이 시스템을 사용하는데 아무런 문제가 없다. 오히려 이런 파일들이 있을 때 시스템에 문제가 생길 가능성이 높다. 그래서 다음과 같이 설정해줄 수가 있다.

LABEL=/home /home ext3 defaults,nosuid,nodev 1 2

- fstab을 위와 같이 바꾸었으면 파일 시스템을 다음과 같이 다시 마운트 한다.
# mount -o remount /tmp
# mount -o remount /home

- 옵션이 제대로 적용되었는지 확인하는 방법은 쉘 스크립트를 간단하게 하나 만든 후 실행 퍼미션을 추가하고 실행해보면 알 수 있다.

# cd /tmp
# vi test.sh
#!/bin/sh
echo “exec test!!”
# chmod a+x test.sh
# ./test.sh
exec test!!
# mount -o noexec,remount /tmp
# ./test.sh
-bash: ./test.sh: /bin/sh: bad interpreter: Permission denied


2. /etc/security



- 인증된 사용자가 어디서나 운영중인 서버로 로그인할 수 있는 환경이라면 서버에 접속이 가능한 사용자에 대해서 통제 및 관리를 강화하기 위해 security 파일을 사용하도록 한다.


2.1 access.conf

- 기본적으로 설치되어 있는 access.conf 파일을 이용하면 인증된 사용자 중 특정한 사용자에 대해 콘솔이나 서버 등에 대한 로그인을 제어할 수 있다. access.conf 파일을 통한 설정은 비교적 쉬운데 안전하면서도 제한적인 서비스를 하기 위한 설정 방법은 다음과 같다.

# vi /etc/security/access.conf
...
-:ALL EXCEPT root test:ALL

- 위의 설정은 root와 test라는 사용자를 제외한 모든 사용자에 대해서 콘솔 및 원격 접속을 차단한다. 여기에 위치 정보를 추가할 수 있다. 즉, 지정된 IP에서만 접근이 가능하도록 설정할 수 있다.

-:ALL EXCEPT root test:192.168.152.2
-:ALL:LOCAL

- 두 번째 줄의 의미는 모든 사용자의 콘솔 접근을 허용하지 않는다는 뜻이므로 root로 로그인하기 위해서는 먼저 IP가 192.168.152.2인 호스트에서 test 계정으로 로그인하고 su를 이용하여 root로 전환하여 로그인하면 된다.

- access.conf 기능을 사용하려면 다음 내용을 /etc/pam.d/login과 sshd에 추가해야 한다.

account required /lib/security/pam_access.so




2.2 limits.conf

- limits.conf 파일을 이용하여 시스템 사용자들이 사용할 수 있는 자원을 제한하거나 제어할 수 있다. 모든 사용자들에 대해서 사용할 수 있는 서버 자원에 대한 제한을 설정하면 서비스 거부 공격(프로세스의 수, 메모리의 양 등에 대한)을 사전에 어느 정도 예방할 수 있다. 이러한 제한의 설정은 사용자가 로그인할 때 적용된다. 파일 내에 있는 기본 설정은 다음과 같다. (주석처리 되어있다.)


- domain은 제한을 할 대상이다. 사용자 이름이나 그룹 이름, 그리고 와일카드 문자를 사용할 수 있다.
- type은 강하게 제한할 것인지 아니면 어느 정도 여유를 줄 것인지를 결정한다.
- item은 제한을 할 항목이다. 항목은 다음과 같다.

core - core 파일의 사이즈(KB)
data - 최대 데이터 크기(KB)
fsize - 최대 파일 사이즈(KB)
memlock - 최대 locked-in-memory 주소 공간(KB)
nofile - 한번에 열 수 있는 최대 파일수
rss - 최대 resident set size (KB)
stack - 최대 스택 사이즈(KB)
cpu - 최대 CPU 점유 시간(MIN)
nproc - 최대 프로세스 개수
as - 주소 공간 제한
maxlogins - 동시 로그인 최대 수
priority - 사용자 프로세스가 실행되는 우선순위

- 일반적으로 사용자별 제한은 그룹의 제한에 우선한다. 그래서 만일 admin 그룹에 아무 제한을 두지 않고 이 그룹의 멤버 중 한 명에 대한 제한을 등록했다면 그 사용자는 제한을 받을 것이다.
그리고 모든 제한 설정은 login 단위로 설정된다. 즉, 세션이 유지되는 동안에만 제한을 받는 것이다.

- 그리고 /etc/pam.d/login 파일의 마지막에 다음과 같이 추가하면 된다.

session required /lib/security/pam_limits.so


2.3 time.conf

- time.conf 파일에 설정되는 값을 통해 시스템의 사용자 이름, 하루 중 특정시간, 일주일 중 특정 요일, 특정한 서비스 또는 접속 요청이 들어오는 터미널 등의 접근을 제한할 수 있다.

- 기본적인 형태는 다음과 같다.

services;ttys;users;times

a. services - 이 규칙이 적용될 서비스의 이름
b. ttys - 규칙을 적용할 터미널의 이름
c. user - 적용할 사용자 이름의 목록
다음의 규칙을 따르는 토큰의 나열인데 이들은 적절한 PAM_ 항목과 연결되게 된다.
* 적어도 하나 이상의 wildcard character '*'를 가진다.
* 부정을 나타내는 '!'를 선택적으로 앞에 쓸 수 있다.
* 논리적 AND인 '&'와 논리적 OR인 ''를 쓸 수 있다.
d. times - 언제 이 규칙을 적용할 것인지를 지정한다. 각 부분은 날짜/시간 범위이다. 날짜는 두 개의 글자의 조합으로 나타낸다. 예를 들어 'MoTuSa'는 월, 화, 토요일을 나타낸다. 반복되는 날은 효력을 상쇄시킴을 주의하라. 'MoTuMo'라고 쓴 경우 실제로는 화요일만 유효하게 처리된다. 'MoWk'라고 쓴 경우 월요일을 제외한 평일이라는 뜻이다. 다음의 두 글자 조합이 유효하게 처리된다.

Mo Tu We Th Fr Sa Su Wk Wd Al

마지막에서 두 번째는 주말을 뜻하고 마지막 항목은 한 주의 모든 날에 해당한다.

시간 범위는 24시간 표시로 나타낸 HHMM형식에다가 하이픈'-'표시로 시작범위와 끝 범위를 지정한다. 만약 끝 시간이 시작시간보다 작다면 다음날의 해당시간으로 해석된다. 'Mo1800-0300'이라고 쓰면 허용되는 시간은 월요일 저녁 6시부터 다음날 새벽 3시까지라는 뜻이다. 주어진 시간제한조건은 앞의 세 개의 필드의 조건이 만족되는 경우에만 적용된다.

- ex)

login ; tty* & !ttyp* ; !root !test ; !A10000-2400

- 위의 설정은 root와 test라는 계정을 제외한 모든 사용자에 대해서 언제나 콘솔의 로그인을 제한한다.

- time.conf에 대해 설명한 것처럼 다양한 설정을 조합해서 접근제어를 할 수도 있는데 예를 들어 관리자인 admin 계정은 모든 접근을 허용하지만 주말과 화요일에는 오전 8시부터 오후 6시까지 콘솔 접근이 불가능하도록 설정할 경우 아래와 같이 설정하면 된다.

login ; * ; !admin ; !Wd0000-2400 !Tu0800-1800

- 다음 예제는 waster라는 사용자를 제외한 나머지 사용자들은 근무시간대에는 게임 서비스가 제한된다.

games ; * ; !waster ; Wd0000-2400 Wk1800-0800

- 위 설정을 사용하기 위해서 /etc/pam.d/login과 sshd 등 제공하려는 서비스에 추가한다.

account required /lib/security/pam_time.so