by 마이클 루카스(Michael Lucas), 역 한빛 리포터 1기 김성진
어떤 서버에는 제각기 다른 목적을 지닌 수백만의 사용자가 있다. 모든 사용자에게 각기 다른 권리를 부여하려면 어떻게 해야 하는가? FreeBSD에서는 몇 가지 방식으로 사용자 접근을 제어한다.
/sbin/nologin 프로그램은 제한된 계정에 사용하며, 전체적으로 통제할 땐
/etc/login.access를 사용한다.
가장 흔한 방법은 관리자가 셸 접근이 아닌, 하나의 사용자 FTP 접근을 허용하는 경우이다. 다른 조건을 생각하지 않는다면,
/sbin/nologin를 사용한다. 여러분은
/etc/shells에
/sbin/nologin를 더해 주기만 하면 된다. 그러면
ftpd가 이 사용자 ID에 대한 연결을 허가할 것이다.
사용자가
/sbin/nologin의 셸을 가지고 있을 때, telnet과 SSH 요청을 하면, 다음을 만나게 된다.
login: loserusername
Password:
Last login: Tue Mar 27 20:33:59 from localhost
Copyright (c) 1980, 1983, 1986, 1988, 1990, 1991, 1993, 1994
The Regents of the University of California. All rights reserved.
FreeBSD 5.0-CURRENT (TURTLEDAWN) #3: Wed Mar 28 14:24:46 EST 2001
This account is currently not available.
Connection closed by foreign host.
|
이 접근법의 과제는 시스템이 연결을 처리하고 사용자를 위한 환경을 구축하는 것이다. 셸을 설정하려면 프로세서에서 처리하는 데 시간이 좀 걸린다. 사용자가 실제 셸을 얻지 않았다는 것을 시스템이 알 때는, 이미 많은 작업을 수행한 후이다.
많은 CPU 시간이 흐르면,
/sbin/nologin은 완전하게 된다. 이는 유닉스 세계에서 통용되는 표준 규범으로, 후기 버전에는 연결을 거부한 사항을 기록해 놓은
/usr/ports/sysutils/no-login이 있다.
하지만 설치 규모가 크면
/sbin/nologin은 능률이 떨어진다. 오식이나, 경험 없는 관리자, 아니면 엄청난 실수로 인해 사용자 셸을 잘못 세팅하는 경우가 생긴다. FreeBSD는
/etc/login.access 파일에 좀더 간단한 방법을 제공한다. 사용자가 FreeBSD 시스템에 연결을 시도할 때마다,
login.access가 체크된다.
login.access를 적절히 설정하면, 사용자가 필요로 하는 모든 기능을 더 간편하게 제공할 수 있다.
/etc/login.access를 보자. 세 개의 콜론(:)으로 나누어지는 필드가 있다. 첫째는 로그 온을 허락(+), 또는 거부(-)한다. 둘째는 사용자나 그룹 목록이다. 셋째는 연결 소스의 목록이다. 파일에서는 “all"과 "all except" 구문이 가능해서, 관리자가 기본적이면서도 많은 것을 표현하는 규칙을 만들 수 있다.
시스템이 그룹과 연결 소스가 매치되는 첫째 규칙을 발견하면, 바로 연결을 받아들이거나 거부한다. 그래서 규칙 순서가 중요하다.
예를 들면, "wheel" 그룹의 멤버와 루트가 실제 콘솔에 로그온할 수 있게만 하려면, 다음처럼 한다.
이 규칙에서 흥미로운 점은 다른 규칙들이 계속해서 처리한다는 것이다. 다른 것을 거부하라고 하지 않고 허가만 한다. 결국, 콘솔에 로그인 하려고 했던 Joe Average 사용자는 이 규칙에 부합하지 않았던 것이다. 다음과 같이 반대로 하면, 더 빠르게 연결을 거부할 수 있으며, 관리자 에러의 위험도 거의 없다.
- : ALL EXCEPT wheel root:console
|
Joe Average는 이 규칙에 부합하므로, 바로 거절되었다. 예기치 않았던 접근을 허용하는, 부주의한 뒤의 규칙에 부합할 가능성은 없다. 허가에 의한 계정보다는 거부된 계정을 기본으로 리스트를 만드는 것이 좋다.
소스를 연결시켜 주는 마지막 필드에는 더욱 다양한 방법이 가능하다. 여기에서는 호스트 이름, 호스트 주소, 네트워크 번호, 도메인 이름,
LOCAL, ALL 등 여러 형태의 정보를 사용할 수 있다.
첫째, ALL은 항상 부합한다. ALL은 EXCEPT와 함께 사용할 때 특히 유용한데, 뒤에 나오는 글에서 살펴 볼 것이다.
호스트 이름은 DNS 와 /, 또는 호스트 파일에 따라 달라진다. 나중에 사용자의 네임서버가 해킹당할 수도 있으므로, 사용하지 않는 게 낫다. 물론, 사용할 수는 있다.
- : ALL EXCEPT wheel:fileserver.mycompany.com
|
wheel 그룹만이 파일 서버로부터 로그인 할 수 있다.
가짜 DNS에 속지 않는 것을 제외하면, 호스트 주소는 유사하다.
- : ALL EXCEPT wheel:169.254.8.3
|
네트워크 번호는 다음과 같이 마침표로 끝난다.
- : ALL EXCEPT wheel:169.254.8 .
|
관리 워크스테이션으로부터 로그인하지 않으면, 어떤 사용자도 당신의 방화벽에 접근할 수 없다.
- : ALL EXCEPT wheel:ALL EXCEPT 192.168.89.128 192.168.170.33 The most complicated location is LOCAL .
|
가장 복잡한 위치(location)는
LOCAL이다. 마침표가 없는 호스트 이름과 부합하는데, 로컬 도메인의 호스트만을 의미한다. 예를 들면, www.blackhelicopters.org는 "blackhelicopters.org"에 있는 호스트가
LOCAL과 부합한다고 생각한다. 이것은 상반된 DNS를 경유하여 작용한다. 랩탑이 pedicular.blackhelicopters.org의 호스트 이름을 요구했어도, 이의 IP 주소는 home.com 네트워크에서 다른 것으로 바뀐다. 필자도
LOCAL 검증 방법을 사용할 수 없었다.
그러면 어떻게 해야 하는가? 단방향(one-line)
login.access는 관리자가 모두 다른 원격 연결이 거절되는 동안 서버에 기록되도록 할 것이다.
많은 회사에는 스태프 그룹이 있으므로, 사용자의 환경에선 다소 제한적일 수 있다. 그래서 필자는 “dns”(도메인 영역 파일을 편집할 수 있는 사람들)와 “www”(웹 서버 설정을 편집할 수 있는 사람들)의 그룹 환경을 미리 설정해 놓았다.
login.access는 아래와 같다.
- : ALL EXCEPT wheel dns www:ALL
|
필자의 시스템에는 다음과 같은
login.access 파일이 있다.
- : ALL EXCEPT wheel:console
- : ALL EXCEPT wheel dns www:ALL
|
하나의 라인은 한번 변하며, 여러분이 사용자를 허가 그룹에 집어넣지 않는 한, 사용자는 로그인할 수 없다. 더 이상
/sbin/nologin에 손상을 주지 않도록 셸을 설정하지 않아도 된다. FreeBSD에서는 1000명의 사용자 계정 대신에, 하나의 파일만 처리하면 되는 것이다.
마이클 루카스(Michael Lucas)는 아내, 그리고 수많은 물고기와 설치류 동물들과 함께 미시간주 디트로이트에서 살고 있으며, Great Lakes Technologies Group에서 네트워크 아키텍처로 근무하고 있다.
김성진님은 현재 한빛 리포터 1기로 활동 중이며, 군산대학교 전자공학과 4학년에 재학 중입니다. 유닉스 셸과 네트워크 기반에 관심이 많으며, 현재는 솔라리스로 공부하고 있다고 합니다.