PostgreSQL 사용자 정보를 Linux PAM과 연동하기 (with Radius)
PostgreSQL에 사용자 DB에 있는 ID, PW를 RADIUS 인증을 통해 Linux 클라이언트 사용자 인증 연동을 진행해볼 것이다!
이 과정은 RADIUS 서버와 PAM 모듈을 사용하여 PostgreSQL DB에 저장된 사용자 정보를 기반으로 Linux 로그인 인증을 처리하는 방법이다.
✅ PAM(Pluggable Authentication Modules) 이란?
리눅스 시스템에서 인증을 관리하고 확장할 수 있게 해주는 프레임워크. PAM은 다양한 인증 방법(패스워드, 스마트 카드, 바이오인증 등)을 통합할 수 있도록 설계되어 있어, 인증 모듈을 시스템에 추가/제거할 수 있게 해준다.
✅ 실습 구성
[Scenario]
DB_SERVER에서 PostgreSQL과 RADIUS 인증 서비스를 구성하고, DB_CLIENT에서 사용자 로그인 시, DB_SERVER에 RADIUS 인증을 거친 후 사용자DB로 부터 정보를 불러와 로그인이 가능해야 한다.
[Test Environment]
DB_SERVER | DB_CLIENT |
OS: Debian 9.6 CLI (stretch) | OS: Debian 9.6 GUI (stretch-GNOME) |
IP: 1.1.1.1 | IP: 1.1.1.2 |
😶🌫️DB_SERVER 설정
- 패키지를 설치한다.
- libnss-pgsql2 : PostgreSQL 데이터베이스를 리눅스의 NSS와 연동할 때 사용하는 라이브러리
- freeradius-postgresql : freeradius 서버와 PostgreSQL DB를 연동할 때 사용하는 모듈.
root@server:~# apt install postgresql-9.6 libnss-pgsql2 freeradius freeradius-postgresql
- 본격적으로 PostgreSQL 셋팅
- PostgreSQL 유저를 생성한다. (* 실제 현업에서는 절때 root 사용 XX!!!!)
- userdb, radius 데이터베이스를 생성한다.
- 처음에 생성했던 유저의 패스워드를 생성한다.
postgres@server:/root$ createuser root –interactive
root@server:~# psql template1
template1=# create database userdb;
template1=# create database radius;
template1=# alter user root with password ‘pass2018!’;
root@server:~# vim /etc/postgresql/9.6/main/postgresql.conf
root@server:~# vim /etc/postgresql/9.6/main/pg_hba.conf
root@server:~# systemctl restart postgresql
- DB에 사용자 정보 넣기
- for문을 이용하여 yynet001~100까지의 사용자를 스크립트를 통해 만들 것이다.
- 생성된 파일을 PostgreSQL에 Import 시킬 것.
root@server:~# vim user.sh
root@server:~# chmod 777 user.sh
root@server:~# ./user.sh
root@server:~# vim dbschema.sql
여기서 z문자열을 tab으로 치환할 것이다.
:%s/z/<tab키를 한번 누름>/g
그럼 아래와 같이 치환될 것이다.
앞서 생성했던 userdb에 dbschema.sql을 import 시킬 것이다.
root@server:~# psql userdb < dbschema.sql
root@server:~# psql radius < /etc/freeradius/3.0/mods-config/sql/main/postgresql/schema.sql
root@server:~# vim radius.sh
root@server:~# chmod 777 radius.sh
root@server:~# ./radius.sh
root@server:~# vim radius.sql
root@server:~# psql radius < radius.sql
root@server:~# systemctl restart postgresql
DB셋팅과 사용자 DB 설정이 완료되었다.
이제 이어서 Radius를 설정해본다!
root@server:~# ln -s /etc/freeradius/3.0/mods-available/sql /etc/freeradius/3.0/mods-enable
root@server:~# vim /etc/freeradius/3.0/mods-enable/sql
root@server:~# vim /etc/freeradius/3.0/clients.conf
root@server:~# systemctl enable freeradius ; systemctl restart freeradius
root@server:~# cp /usr/share/doc/libnss-pgsql2/examples/nss* /etc/
root@server:~# vim /etc/nss-pgsql.conf
root@server:~# vim /etc/nsswitch.conf
root@server:~# for a in {001..100}; do mkdir -p /home/yynet${a}; done
root@server:~# for a in {001..100}; do chown yynet${a} -R /home/yynet${a}; done
root@server:~# for a in {001..100}; do chmod 777 -R /home/yynet${a}; done
각 사용자 별 home폴더가 생성까지 마쳤다면, 이제 Client에서 PAM 연동 설정을 진행해볼 것이다.
😶🌫️DB_CLIENT 설정
root@client:~# apt install libnss-pgsql2 libpam-radius-auth
root@client:~# cp /usr/share/doc/libnss-pgsql2/examples/nss* /etc/
root@client:~# vim /etc/nss-pgsql.conf
root@client:~# vim /etc/nsswitch.conf
root@client:~# cp /usr/share/doc/libpam-radius-auth/examples/pam_radius_auth.conf /etc/
root@client:~# vim /etc/pam_radius_auth.conf
root@client:~# vim /etc/pam.d/common-account
root@client:~# vim /etc/pam.d/common-auth
root@client:~# reboot
🫢동작 테스트!
성공이다!
client에서 getent passwd 하면 yynet001~100까지의 사용자가 정상적으로 받아와지는 것을 확인할 수 있다.
주의해야할 것은, PAM 설정을 잘못하면 관련 설정이 꼬여버려서... 버려야하는 상황이 생길 수 있으니 주의해야한다..
그럼, 여기서 끄읏!