FreeIPA를 이용한 통합 인증 (SSO)

들어가기 전에

이 게시물은 Ubuntu 20.04 , Ubuntu 21.10 에서 FreeIPA Server와 FreeIPA Client의 설치 및 작동원리에 대한 글입니다. 다른 배포판에서는 확인해보지 못하였으며, 명령어 또한 상이한 부분이 있을 수 있습니다.

개요

여러 대의 서버를 운영할 때 사용자의 인증은 중대한 문제 중 하나입니다. 프로메디우스는 Ubuntu 기반의 인프라용 서버 2대, GPU 서버 5대를 운영하고 있습니다. 총 7대의 서버를 운영하면서 발생한 문제는 다음과 같습니다.

  1. 새로운 유저가 있을 때 유저를 7대에 모두 추가시켜 주어야 합니다
  2. 새로운 유저가 있을 때 유저의 SSH 키를 7대에 모두 등록해 주어야 합니다
  3. NFS 등의 서비스를 위해 서버 간 유저의 UID를 일관성있게 관리해야 합니다

이러한 문제점들은 새로운 유저가 추가될 수록 부담이 되고, 수동으로 관리하기에 부담이 생기게 됩니다.

프로메디우스에서는 이러한 문제들을 해결하기 위해 FreeIPA를 이용하여 통합 인증을 관리하고 있습니다.

FreeIPA란?

FreeIPA란 Red Hat에서 Identity Management을 위해 만들어진 소프트웨어입니다. Directory Service, Authentication Service, PKI Service 등을 포함하고 있습니다.

FreeIPA는 크게 FreeIPA Server와 FreeIPA Client으로 나뉘어져 있습니다. FreeIPA Server는 독립된 Linux Server이며, FreeIPA Client은 SSO 인증을 진행할 타겟 서버들에 설치되는 구성요소입니다.

FreeIPA Server 설치

FreeIPA Server는 CentOS계열 OS에만 설치가 가능합니다. CentOS를 만져본 적이 없어 저희는 Docker에 Rocky Linux 8 기반 FreeIPA Server 이미지를 이용하여 설치를 진행하였습니다.

먼저, FreeIPA 서버의 Hostname은 A 레코드로 등록되어 있어야 합니다. 그 외의 경우 (CNAME 등) 설치에 실패하므로 유의하시길 바랍니다.

다음으로, FreeIPA Server 데이터를 초기화합니다. Command Line Option들로 Non-interactive하게 처리할 수도 있지만, Interactive한 것이 초기화하기 편하여 다음과 같은 명령어로 FreeIPA 데이터를 초기화하도록 하였습니다.

docker run --rm -it \
  -h ipa.promedius.dev \
  --sysctl net.ipv6.conf.all.disable_ipv6=0 \
  -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
  -v ./data:/data:Z \
  freeipa/freeipa-server:rocky-8
FreeIPA Server 데이터 초기화

초기화가 완료되면 다음과 같은 메시지가 나타날 것입니다.

# 
# Please add records in this file to your DNS System
# 
# /tmp/ipa.system.records.8i233cro.db
#

다음 명령어를 통해 해당 파일의 내용을 읽을 수 있습니다.

docker exec -it $(docker ps -aqf "ancestor=freeipa/freeipa-server:rocky-8") cat /tmp/[마지막에 나와 있던 파일 이름]

파일에는 다음과 같은 내용이 적혀 있을 것입니다.

_kerberos-master._tcp.promedius.dev. 86400 IN SRV 0 100 88 ipa.promedius.dev.
_kerberos-master._udp.promedius.dev. 86400 IN SRV 0 100 88 ipa.promedius.dev.
_kerberos._tcp.promedius.dev. 86400 IN SRV 0 100 88 ipa.promedius.dev.
_kerberos._udp.promedius.dev. 86400 IN SRV 0 100 88 ipa.promedius.dev.
_kerberos.promedius.dev. 86400 IN TXT "PROMEDIUS.DEV"
_kpasswd._tcp.promedius.dev. 86400 IN SRV 0 100 464 ipa.promedius.dev.
_kpasswd._udp.promedius.dev. 86400 IN SRV 0 100 464 ipa.promedius.dev.
_ldap._tcp.promedius.dev. 86400 IN SRV 0 100 389 ipa.promedius.dev.
ipa-ca.promedius.dev. 86400 IN A 10.0.10.13

위 내용과 같이 DNS 설정을 해 주시면 됩니다.

다음 명령어로 초기화를 위해 실행했던 docker container를 중지 및 제거할 수 있습니다

docker kill $(docker ps -aqf "ancestor=freeipa/freeipa-server:rocky-8") 

이제 다음과 같은 docker-compose 파일을 이용하여 FreeIPA 서버를 구동할 수 있습니다.

version: '3.7'
services:
  freeipa:
    image: freeipa/freeipa-server:rocky-8
    hostname: ipa.promedius.dev
    restart: always
    ports:
      - 11080:80    # Web UI (http)
      - 11443:443   # Web UI (https)
      - 389:389     # LDAP/LDAPS
      - 636:636     # LDAP/LDAPS
      - 88:88       # kerberos
      - 464:464     # kerberos
      - 88:88/udp   # kerberos
      - 464:464/udp # kerberos
      - 123:123/udp # NTP
    volumes:
      - /sys/fs/cgroup:/sys/fs/cgroup:ro
      - ./data:/data:Z
    sysctls:
      - net.ipv6.conf.all.disable_ipv6=0
docker-compose.yml

FreeIPA Client 설치

FreeIPA의 Client Side 설치는 SSO를 적용할 서버 에 설치하여야 합니다. 이를 위해서 freeipa-client 패키지를 설치 해 줍니다.

sudo apt install freeipa-client
freeipa-client 설치

freeipa-client 가 설치된 후 다음 명령어를 통해 FreeIPA Client을 설치합니다.

sudo ipa-client-install --mkhomedir
FreeIPA Client 설치

설치 후, 다른 컴퓨터에서 서버에 접속하게 되면 IPA에 등록된 사용자 계정으로 로그인 할 수 있습니다.

만약 설치 중 --mkhomedir 옵션을 빼먹었다면 다음과 같은 명령어로 활성화시킬 수 있습니다

sudo pam-auth-module

맺음말

지금까지 FreeIPA Server / FreeIPA Client 셋팅 방법에 대한 글이었습니다. 서버 관리에 도움이 되었으면 합니다.