[keycloak] Linux 서버의 SSH(+ sudo) 인증 설정


Keycloak 유저로 ssh 로그인 하기.


구성도

graph TD;
  subgraph Linux
    CLIENT[시작: ssh/sudo] -->|1. PAM 모듈 호출|PAM(pam_radius_auth.so)
    PAM-->|6. 인증 완료|CLIENT
  end
  
  subgraph Radius-Server
    PAM-->|2. RADIUS 요청|RADIUS_SERVER
  end

  subgraph Keycloak
    RADIUS_SERVER-->|3. 권한확인 요청|KEYCLOAK[Keycloak]
    KEYCLOAK-->|4. 권한확인 응답|RADIUS_SERVER
  end
  
  RADIUS_SERVER-->|5. RADIUS 응답|PAM

pam_radius_auth.so 빌드 하기

  • 저는 Mac을 사용하므로 ubuntu docker 이미지를 사용해서 빌드합니다.
  • 다운로드 혹은 clone 받은 소스 디렉토리에서 진행 합니다.
  • 빌드용 이미지 생성을 위한 Dockerfile
FROM ubuntu

RUN \
  apt-get update --force-yes -y && \
  apt-get install --yes build-essential libpam0g-dev make
  • docker build
$ docker build -t pam_builder .
  • docker run
$ docker run -v $(pwd):/pam_radius -w /pam_radius pam_builder ./configure
$ docker run -v $(pwd):/pam_radius -w /pam_radius pam_builder make
  • 빌드가 완료되면 pam_radius_auth.so파일이 생성됩니다.

pam_radius_auth.so 업로드 하기

  • 저는 ubuntu 서버에 업로드 후 /opt/pam/pam_radius_auth.so 경로에 위치 시켰습니다.

pam_radius_auth.so 설정하기

  1. /etc/raddb/server 파일 생성 - 소스상의 pam_radius_auth.conf 파일 참조.
...
# server[:port]             shared_secret      timeout (s)  source_ip            vrf
<radius-server>:<auth-port>	     <shared_secret>		<timeout>
...

sshd 설정

  • pam_radius_auth.so 설정 옵션 참고
  • /etc/pam.d/sshd 설정.
    • @include common-auth을 남겨두고. pam_radius_auth.so의 pam option을 [default=ignore]로 설정 하면 pam_radius_auth.so를 이용한 인증이 실패 할 경우 기본 linux 사용자 인증 방식으로 인증 가능.
    • client_id는 RADIUS서버로 전달 될때 NAS-Identifier로 전달되니 여러대의 서버에 설정 할 경우 서버 및 ssh, sudo를 구분 할 수 있는 값을 사용하면 됩니다.(RADIUS 서버 설치 및 Keycloak 연동 설정의 python 모듈에서 NAS-Identifier 값으로 분기처리 가능.)
...
# Standard Un*x authentication.
auth [success=done default=ignore]	/opt/pam/pam_radius_auth.so client_id=ssh-10.100.13.179 force_prompt prompt_attribute
@include common-auth
...
  • /etc/ssh/sshd_config 기본 설정.
    • PasswordAuthentication no 설정시 sshd에서 기본으로 출력하는 비밀번호를 묻는 prompt를 노출하지 않습니다.
    • ChallengeResponseAuthentication yes 설정시 PAM 모듈에서 사용자에게 노출 할 prompt 메세지를 핸들링 할 수 있습니다.
...
PasswordAuthentication no
ChallengeResponseAuthentication yes
...
  • /etc/ssh/sshd_config 추가설정
    • 특정 사용자(keycloak / radius-server 접속 불가시 사용)를 제외하고 RSA key를 이용한 로그인을 막고 싶은 경우.
    • 아래 예시와 같이 AuthorizedKeysFile를 절대경로로 지정.
AuthorizedKeysFile	/home/dorma/.ssh/authorized_keys

2. sudo 설정

  • /etc/pam.d/sudo 설정.
    • @include common-auth을 남겨두고. pam_radius_auth.so의 pam option을 [default=ignore]로 설정 하면 pam_radius_auth.so를 이용한 인증이 실패 할 경우 기본 linux 사용자 인증 방식으로 인증 가능.
    • client_id는 RADIUS서버로 전달 될때 NAS-Identifier로 전달되니 여러대의 서버에 설정 할 경우 서버 및 ssh, sudo를 구분 할 수 있는 값을 사용하면 됩니다.(RADIUS 서버 설치 및 Keycloak 연동 설정의 python 모듈에서 NAS-Identifier 값으로 분기처리 가능.)
...
auth [success=done default=ignore] /opt/pam/pam_radius_auth.so client_id=sudo-10.100.13.179 force_prompt prompt_attribute
@include common-auth
...

관련글 목록

1. Keycloak를 이용한 SSO 구축

2. Keycloak 설치하기(with Kubernetes)

3. RADIUS 서버 설치 및 Keycloak 연동 설정

4. Linux 서버의 SSH(+ sudo) 인증 설정

5. EAP-TTLS & PAP 접속 설정

번외. Custom Linux PAM을 이용해 Keycloak 계정으로 ssh, sudo 인증 하기

번외. TinyRadius로 RADIUS 서버 만들기(feat. netty)

comments powered by Disqus