LINUX PAM

사용자를 인증하고 그 사용자의 서비스에 대한 액세스를 제어하는 모듈화된 방법. PAM은 관리자가 응용포로그램들의 사용자인증방법을 선택할 수 있도록 해준다. 즉, Linux System에 대한 권한, 설정등을 하는데 있어서 유연성, 보안성을 제공하기 위한 소프트 웨어라고 생가하면 된다.


관련 디렉토리

/etc/pam.d – 서비스+시스템의 인증 설정 파일

/lib/x86_64-linux-gnu/security - PAM인증 모듈(리눅스 버전에 따라 다를 수 있음)



PAM인증 설정 파일의 구조


[Auth Type] [Control Flag] [Module_Path] [Module_Argument]

Auth Type

auth : 이 모듈타입은 사용자 인증의 두가지 면을 제공한다. 첫째는, 응용프로그램이 사용자에게 패스워드를 물어보거나 다른 확인 방법을 사용하도록 해서 그 사용자가 자신이 주장하는 사람이 맞는지 확인하는 것이다. 두번째는, 그룹 멤버쉽을 주거나 (앞서 이야기한 /etc/groups파일에 있는 내용을 통해서) credential(신임)속성을 통해 다른 권한을 주는 것이다.

account : 이 모듈은 인증이 아닌 계정관리를 수행한다. 이것은 보통 시간/날짜나 현재의 시스템 자원 상황(최대 사용자수)이나 사용자의 위치('root'는 콘솔에서만 로그인이 가능하다)등에 따라 서비스에 대한 접근을 허가하거나 제한하는 것이다.

password : 사용자와 연관된 인증토큰 (패스워드)들을 갱신할 때 필요하다. 보통, challenge/response 방식에 기반한 인증모듈 종류별로 각각 하나의 password모듈씩이 존재한다.

session : 서비스를 사용하기 직전/직후에 필요한 작업과 관련이 있다. 이러한 것들은 사용자와 교환할 어떤 데이터들의 opening/closing과 관련한 정보들의 기록, 디렉토리의 마운트 등이 해당된다.

Control Flag : 통제를 담당하는 부분으로 PAM에 무엇을 해야할 지를 알려준다. 4가지의 형식이 있다.

required

성공 : 다음 모듈을 실행(영향 X)

실패 : 다음 모듈을 실행(다른 모듈이 성공을 해도 무조건 실패를 반환/최종 실패)

sufficient

성공 : 다음 모듈을 실행하지 않고 중단(최종 성공)

실패 : 다음 모듈을 실행(다른 모듈에게 영향을 주지 않음)

requisite

성공 : 다음 모듈을 실행(영향 X)

실패 : 다음 모듈을 실행하지 않고 중단(최종 실패)

optional

성공, 실패에 중요치 않고 모듈을 실행

주요 모듈


pam_permit.so

-무조건 성공 반환

-auth type 모두 가능

EX)auth sufficient pam_permit.so //인증에 있어서 해당 계정과 비밀번호에 대해서 일치하는지 유무를 보지않고 무조건 성공


pam_deny.so

-무조건 실패

-auth type 모두 가능

-실패 시 각기 인증 종류에 따라서 다른 결과를 리턴하나 무조건 실패


pam_access.so

-Login Access Control Table

-로그인 시 접근제어 리스트를 이용하여 허용과 차단설정

-/etc/security/access.conf 사용

-auth type모두 가능

-리턴 값은 /etc/security/access.conf에 따라 달라짐

/etc/security/access.conf 필드 설정

[permission] : [users] : [origins]

permission : 권한(+허용,-거부)

users : 계정, 그룹, ALL

origins : IP, HOST, 네트워크 대역, ALL

EX)ssh에서 192.168.0.10에서 들어오는 IP차단

/etc/pam.d/sshd

auth required pam_access.so

/etc/security/access.conf

-:ALL:192.168.0.10

+:ALL:ALL


pam_time.so

-시간을 이용하여 인증 모듈을 사용

-auth type은 account만 가능

-/etc/security/time.conf를 이용하여 제어

-계정에 대한 비밀번호와 무관하게 들어오는 계정을 시간을 이용하여 차단, 허용

/etc/security/time.conf 필드 설정

[services] ; [ttys] ; [users] ; [times]

services : 적용할 서비스

ttys : 적용할 터미널 방식

users : 계정, 그룹, *

times : 시간과 분, 날짜 기록(시간은 24시로 HHMM)

EX)ssh에서 test라는 계정에 대해서 수요일 오전 9시부터 오후5시까지 접근허용, 나머진 불가

/etc/pam.d/sshd

account required pam_time.so

/etc/security/time.conf

sshd;*;test;we0900-1700


pam_listfile.so

-파일에 있는 목록을 이용하여 접근제어

-auth type모두 가능

-Module-Argument사용

-옵션, Item, TIME, Sense, file, onerr, apply, quiet등이 있음

Item

=파일에 있는 목록을 어떠한 종류의 항목으로 할 것인지

tty | user | rhost | ruser | rgroup | shell

file

=어떤 경로에 파일이 위치하는지 지정

Sense

=파일의 목록을 item에 따라서 해당 목록에 있는 값과 일치하는 경우 allow이면 내용을 보여주고 deny이면 거부

onerr

=에러가 발생시 어떻게 처리 할지를 경정

=succed | fail

=옵션을 사용할 경우 파일의 경로를 찾아 갔을 때 지정한 파일이 경로에 존재하지 않을 경우 모듈의 값을 성공으로 할 것인지 실패로 할 것인지 설정

=Sense가 allow이면 onerr는 fail

EX)ssh를 사용할 수 있는 계정을 test로만 설정

/etc/pam.d/sshd

auth required pam_listfile.so item=user sense=allow onerr=fail file=/etc/security/list.list

/etc/security/list.list

test


pam_secceed_if.so

-if문을 사용하듯이 사용

-옵션 값이 사용됨

-auth type 모두 가능

-옵션: user, group, shell, uid, gid, home, service

field [관계연산자] 값

EX) user = test // 계정이 test라면

uid = 500 // uid값이 500이라면

gid >= 500 // gid값이 500이상이라면

user ingroup test // 해당 계정이 test그룹안에 포함되어 있다면

user notingroup test // 해당 계정이 test 그룹안에 포함되어 있지 않다면

use_uid // 현재 사용하는 계정을 이용

quiet // 실패시 기록 남김

auth required pam_succeed_if.so user = test


pam_rootok.so

-root 계정일 시 무조건 성공 반환

-root 계정이 아닐 시 무조건 실패

-auth type은 auth만 가능

EX)su에서 root에서 다른 계정으로 넘어갈 시 비밀번호에 대해서 묻지않게 설정

/etc/pam.d/su

auth sufficient pam_rootok.so


pam_wheel.so

-계정이 wheel그룹안에 포함되어 있다면 성공 그렇지 않으면 실패

-auth type은 auth, account가능

-계정 그룹을 이용하여 접근 제어하고자 할 경우 많이 사용


pam_env.so

-환경 변수에 대한 설정을 하여 성공, 실패

-환경 변수에 대한 적용/ 미적용 (기본값은 미적용)

-기본적으로 무조건 성공

-auth type은 auth, session가능


pam_fprintd.so

-패스워드 프롬프트를 대신하는 인증 서비스

-현재는 사용하지 않음.

-무조건 실패


pam_unix.so

-현재 사용하는 패스워드 인증 모듈

-기존 유닉스 계열의 운영체제의 패스워드 인증 모듈

-/etc/passwd, /etc/shadow 파일을 참조하여 패스워드 인증.



PAM을 응용한 예시

proftpd

보안을 위해 ftpusers를 사용하지 않고 root만 로그인 가능하도록 설정.


[root]#rm -rf /etc/ftpusers


[root]#vim /etc/proftpd/proftpd.conf

DefaultRoot ~ //주석 제거

RootLogin ON //추가


AuthOrder mod_auth_pam.c* mod_auth_unix.c //주석 제거


[root]#vim /etc/pam.d/proftpd

#auth required pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed //주석

auth required pam_nologin.so //추가


[root]#vim /etc/pam.d/login

#auth required pam_nologin.so //주석 제거


[root]#touch /etc/nologin




안녕하세요. 이번에는 DHCP 서버를 구축해보도록 하겠습니다.

DHCP의 네트워크 이론에 대해서는 네트워크 이론 탭의 DHCP 를 확인 부탁드리겠습니다.


그럼 시작하겠습니다.


먼저, Windows Server 2016에서 역할 및 기능 추가에 들어가주세요.



DHCP 서버를 체크하시고 다음을 눌러주세요. 그다음 전부 기본값으로 다음(N) 을 눌르시고,




설치를 진행해줍시다.



서버관리자의 도구에서 DHCP를 클릭해줍시다.



DHCP -> 서버(Computer) -> IPv4 우클릭 -> 새범위를 눌러줍시다.


* 범위란 DHCP를 통해 IP를 부여해 줄 범위(구역)을 뜻합니다.



자신만의 DHCP 범위 이름을 지정해줍시다.

저는 etsun_dhcp 로 지정하겠습니다.



여기서 범위 설정으로, 시작 IP 주소로는 가장 처음 DHCP 서버에 연결된 클라이언트에게 줄 IP부터 끝인 10.0.0.200 까지를 순차적으로 배분합니다.


10.0.0.1 은 DHCP 서버의 IP주소이므로, 충돌이 나면 통신불능에 빠지니까 시작 IP주소를 사용 가능한 IP주소의 가장 처음 시작IP인

10.0.0.2 를 시작으로, 적당하게 10.0.0.200 까지로 저는 설정하겠습니다.


서브넷 마스크 프리픽스는 24로, 255.255.255.0 을 설정하겠습니다.


다 설정하셨다면 다음을 눌러줍시다.



위에서 설정한 IP주소 시작부터 끝까지의 범위중 배분을 하지않을 IP주소 범위를 정하는 곳 입니다.


여기서 만약에 시작 IP주소를 10.0.0.100, 끝 IP주소를 10.0.0.200 으로 지정하게된다면,

IP 배분이 10.0.0.100부터 10.0.0.200 은 안됩니다. 그만큼 이 기능은 유용하게 사용이 가능합니다.

저는 사용하지 않겠습니다만, 사용하실분을은 자율적으로 사용해주셔도 좋습니다.



IP주소 임대기간을 설정하는 곳 입니다.

DHCP에서의 임대란 무엇인지에 대해서는 네트워크 이론탭의 DHCP를 확인해주세요.


저는 기본값인 8일을 사용하겠습니다.



지금바로 DHCP 옵션을 구성해줍시다.


여기서는 기본 게이트웨이를 설정하게됩니다.


게이트웨이는 추후 네트워크 이론에서 자세히 설명하겠지만, 여기서 간단히 설명하자면 IP주소가 가장 첫번째로 통신을 시도하는 구간 이라고 생각하시면 됩니다.


여기서 게이트웨이가 10.0.0.1로 되어있다면, 해당 DHCP 서버에서 IP를 받은 PC는 기본 게이트웨이가 10.0.0.1 로 잡혀서 다른 네트워크와 통신하기 위해서는 첫번째로 통신을 시도하는 구간인 10.0.0.1을 통해서 지나가야 합니다.


이해하기 어렵겠지만, 추후 다시 설명하겠습니다. 일단 저는 기본 게이트웨이를 설정하지않겠습니다.

( DHCP 서버의 네트워크 주소와, 분배할 네트워크 주소가 똑같기 때문에 현재는 필요하지 않습니다. )



DNS 서버를 설정할 수 있는 곳 입니다.

DHCP를 통해 기본 DNS 주소를 설정할 수 있습니다.


우측 중하단에서 기본 DNS 서버로 지정하기 원하시는 IP 주소를 입력뒤에 오른쪽에 활성화되는 추가 버튼을 누르시면 추가가 됩니다.


현재 Windows Server에는 DNS 서버가 구축되어서, 자동적으로 10.0.0.1이 입력되었습니다. 저는 여기서 아무런 설정도 건들지않고 다음을 누르겠습니다.




WINS 서버 IP를 DHCP를 통해 부여하실 일이 있다면, 이 기능또한 위에 기본 DNS 주소 설정처럼 설정하시면 됩니다.


저는 아무런 설정을 하지않고 다음을 누르겠습니다.



지금 활성화를 하겠습니다. 그리고 뜨는 창에서는 마침을 눌러주세요.




정상적으로 범위가 등록되었는지 확인해줍시다.



이제 Windows 7 클라이언트로 이동하겠습니다.



네트워크 인터페이스 속성의 IPv4에서 IP 주소 설정부분을 모두 자동으로 체크해주고 확인을 눌러줍시다.



그리고 cmd에서 ipconfig /renew 명령어를 이용하여, IP주소를 새로 받아오고 IPv4 주소가 정상적으로 불러와진다면 DHCP 서버 구축을 정상적으로 완료하신겁니다.



이번 포스팅은 여기까지입니다. 감사합니다.




먼저, 간단히 설명하자면 자동으로 IP 주소를 할당해주는 프로토콜 이라고 이해하면 됩니다.


사내에서 A라는 회사원이 10.10.0.1 의 IP주소를 사용해야 하는데, B라는 회사원이 실수로 10.10.0.1으로 IP주소로 설정하면, A회사원과 B회사원의 IP주소가 충돌되어, 통신불능 상태에 빠지게됩니다.

이러한 현상을 방지하기위해 DHCP서버를 구축해서 자동으로 아이피를 부여해주고 회수하는 과정을 필요로 하게된 것 입니다.


가장먼저 DHCP서버에서 먼저 해야하는 일은 임대(Lease) 입니다.


임대란? 우리가 생각하는 그 임대 맞습니다. 빌려주는 것.


DHCP 서버에서 IP를 주는 범위를 설정할 수 있는데,

10.0.0.2 에서 10.0.0.200을 임대하라고 설정되어있으면, 위 사진처럼 PC1에 10.0.0.2 를 할당해주고, PC2에 10.0.0.3을 할당해줍니다.


가장 적은수의 IP를 먼저 임대해주는 것 입니다.


그럼, 말그대로 임대이므로 기간이 지나게되면 이 IP를 회수해야 합니다.


DHCP서버에서 설정해놓은 임대기간을 초과하면, IP는 다시 DHCP서버로 돌아가게됩니다.

혹은 DHCP클라이언트가 종료되었을때도 설정된 IP는 다시 DHCP서버로 돌아가게됩니다.


DHCP서버로 IP가 다시 돌아가게된다면 이것은 반환(Release) 입니다.


하지만 갱신(Renewal) 이라는것이 있습니다.


임대기간이 끝나게되면 IP가 서버로 돌아가게되는데, 만약 임대기간을 2시간으로 설정해놓고 DHCP클라이언트가 2시간이상 사용중이면, 이 IP는 2시간째에 IP가 저절로 서버로 돌아가서, IP가 사라지므로 인터넷이 끊기게 됩니다.


이러한것을 임대 갱신 (Lease Renewal) 이라고 합니다.


위처럼 임대기간을 2시간으로 설정해둔다면, 50%인 1시간째 남았을때 한번 갱신을 시도하게됩니다. 여기서 갱신에 성공하게된다면 그 시간을 기준으로 다시 2시간의 시간이 충전되게 됩니다.


하지만, 50%일때 갱신에 실패하게된다면, 약 85%의 시간이 지났을때 다시 갱신을 시도합니다.

이때도 마찬가지로 갱신에 성공하면 이 갱신성공 시간을 기준으로 다시 시간이 충전되게 됩니다. 



DHCP서버에서는 이러한 과정이 계속해서 이루어져야 합니다.


감사합니다.



+ Recent posts