Infrastructure/Linux Server

PostgreSQL 사용자 정보를 Linux PAM과 연동하기 (with Radius)

seongho.choi 2024. 8. 24. 04:30
반응형

 

PostgreSQL에 사용자 DB에 있는 ID, PW를 RADIUS 인증을 통해 Linux 클라이언트 사용자 인증 연동을 진행해볼 것이다!

이 과정은 RADIUS 서버와 PAM 모듈을 사용하여 PostgreSQL DB에 저장된 사용자 정보를 기반으로 Linux 로그인 인증을 처리하는 방법이다.

 

✅ PAM(Pluggable Authentication Modules) 이란?

 리눅스 시스템에서 인증을 관리하고 확장할 수 있게 해주는 프레임워크. PAM은 다양한 인증 방법(패스워드, 스마트 카드, 바이오인증 등)을 통합할 수 있도록 설계되어 있어, 인증 모듈을 시스템에 추가/제거할 수 있게 해준다.

 

✅ 실습 구성

[그림1] 실습 토폴로지

[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

[그림2] listen할 IP 설정 실무에서는 이라믄 안돼...!!!
[그림3] ssl 인증 여부. 일단! false...ㅎ

 

root@server:~# vim /etc/postgresql/9.6/main/pg_hba.conf

[그림4] PostgreSQL 데이터베이스 서버의 인증 방식을 설정하는 구성 파일

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 설정을 잘못하면 관련 설정이 꼬여버려서... 버려야하는 상황이 생길 수 있으니 주의해야한다..

 

그럼, 여기서 끄읏!

반응형