HashiCorp Vault

안녕하세요, 오늘은 지난 포스트에서 다루었던 리눅스 환경의 중앙 집중식 사용자 인증 및 권한 관리 시스템인 FreeIPA의 후속편으로, HashiCorp Vault를 이용한 비밀 관리 시스템 구축에 대해 상세히 알아보겠습니다. 시스템 엔지니어와 아키텍트를 위한 실전 가이드의 두 번째 이야기로, Vault 설치부터 FreeIPA(LDAP) 연동, 그리고 시스템 계정 관리까지 단계별로 설명드리겠습니다.

1. HashiCorp Vault 소개

HashiCorp Vault는 민감한 데이터를 안전하게 저장하고 관리하기 위한 도구로, 비밀 관리, 암호화 서비스, 접근 제어 기능을 제공합니다. FreeIPA에 저장된 사용자 계정으로 Vault에 인증할 수 있도록 LDAP 연동을 구성하겠습니다.

2. Vault 설치 방법

2.1 Rocky Linux 8에 YUM을 통한 Vault 설치

bash# HashiCorp 리포지토리 추가
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo

# Vault 설치
sudo yum -y install vault

# Vault 설정 파일 생성
sudo mkdir -p /etc/vault.d
sudo tee /etc/vault.d/vault.hcl > /dev/null <<EOF
storage "file" {
  path = "/opt/vault/data"
}

listener "tcp" {
  address     = "0.0.0.0:443"
  tls_cert_file = "/etc/ssl/certs/vault.crt"
  tls_key_file = "/etc/ssl/private/vault.key"
}

api_addr = "https://$(hostname -f):443"
cluster_addr = "https://$(hostname -f):8201"
ui = true
EOF

# 필요한 디렉토리 생성
sudo mkdir -p /opt/vault/data
sudo chown -R vault:vault /opt/vault

# 서비스 활성화 및 시작
sudo systemctl enable vault
sudo systemctl start vault

2.2 Docker Compose를 이용한 Vault 설치

bash# Docker 및 Docker Compose 설치 (아직 설치되지 않은 경우)
sudo dnf install -y docker docker-compose
sudo systemctl enable --now docker

# Vault용 디렉토리 생성
mkdir -p ~/vault/config ~/vault/data ~/vault/logs ~/vault/certs

# 인증서 및 키 파일 복사 (기존 인증서가 있다고 가정)
cp /path/to/your/cert.crt ~/vault/certs/vault.crt
cp /path/to/your/private.key ~/vault/certs/vault.key

# Vault 설정 파일 생성
cat > ~/vault/config/vault.hcl <<EOF
storage "file" {
  path = "/vault/data"
}

listener "tcp" {
  address     = "0.0.0.0:443"
  tls_cert_file = "/vault/certs/vault.crt"
  tls_key_file = "/vault/certs/vault.key"
}

api_addr = "https://$(hostname -f):443"
cluster_addr = "https://$(hostname -f):8201"
ui = true
EOF

# Docker Compose 파일 생성
cat > ~/vault/docker-compose.yml <<EOF
version: '3.7'
services:
  vault:
    image: hashicorp/vault:latest
    container_name: vault
    ports:
      - "443:443"
      - "8201:8201"
    restart: always
    volumes:
      - ./config:/vault/config
      - ./data:/vault/data
      - ./logs:/vault/logs
      - ./certs:/vault/certs
    cap_add:
      - IPC_LOCK
    entrypoint: vault server -config=/vault/config/vault.hcl
    environment:
      - VAULT_ADDR=https://127.0.0.1:443
EOF

# Docker Compose 실행
cd ~/vault
docker-compose up -d

3. Vault 이중화 구성

Vault는 고가용성을 위해 이중화 구성이 가능합니다. 여기서는 Raft 스토리지 백엔드를 사용한 이중화 구성을 살펴보겠습니다.

3.1 YUM 설치 기반 Vault 이중화

첫 번째 서버(vault01)의 설정:

bashsudo tee /etc/vault.d/vault.hcl > /dev/null <<EOF
storage "raft" {
  path    = "/opt/vault/data"
  node_id = "vault01"
  
  retry_join {
    leader_api_addr = "https://vault01.ioresponse.com:443"
  }
  retry_join {
    leader_api_addr = "https://vault02.ioresponse.com:443"
  }
}

listener "tcp" {
  address     = "0.0.0.0:443"
  tls_cert_file = "/etc/ssl/certs/vault.crt"
  tls_key_file = "/etc/ssl/private/vault.key"
}

api_addr = "https://vault01.ioresponse.com:443"
cluster_addr = "https://vault01.ioresponse.com:8201"
ui = true
EOF

sudo systemctl restart vault

두 번째 서버(vault02)의 설정:

bashsudo tee /etc/vault.d/vault.hcl > /dev/null <<EOF
storage "raft" {
  path    = "/opt/vault/data"
  node_id = "vault02"
  
  retry_join {
    leader_api_addr = "https://vault01.ioresponse.com:443"
  }
  retry_join {
    leader_api_addr = "https://vault02.ioresponse.com:443"
  }
}

listener "tcp" {
  address     = "0.0.0.0:443"
  tls_cert_file = "/etc/ssl/certs/vault.crt"
  tls_key_file = "/etc/ssl/private/vault.key"
}

api_addr = "https://vault02.ioresponse.com:443"
cluster_addr = "https://vault02.ioresponse.com:8201"
ui = true
EOF

sudo systemctl restart vault

3.2 Docker Compose 기반 Vault 이중화

첫 번째 서버(vault01)의 docker-compose.yml:

yamlversion: '3.7'
services:
  vault:
    image: hashicorp/vault:latest
    container_name: vault
    ports:
      - "443:443"
      - "8201:8201"
    restart: always
    volumes:
      - ./config:/vault/config
      - ./data:/vault/data
      - ./logs:/vault/logs
      - ./certs:/vault/certs
    cap_add:
      - IPC_LOCK
    entrypoint: vault server -config=/vault/config/vault.hcl
    environment:
      - VAULT_ADDR=https://127.0.0.1:443
    networks:
      - vault-net

networks:
  vault-net:
    driver: bridge

각 서버의 ~/vault/config/vault.hcl 파일:

vault01:

hclstorage "raft" {
  path    = "/vault/data"
  node_id = "vault01"
  
  retry_join {
    leader_api_addr = "https://vault01.ioresponse.com:443"
  }
  retry_join {
    leader_api_addr = "https://vault02.ioresponse.com:443"
  }
}

listener "tcp" {
  address     = "0.0.0.0:443"
  tls_cert_file = "/vault/certs/vault.crt"
  tls_key_file = "/vault/certs/vault.key"
}

api_addr = "https://vault01.ioresponse.com:443"
cluster_addr = "https://vault01.ioresponse.com:8201"
ui = true

vault02:

hclstorage "raft" {
  path    = "/vault/data"
  node_id = "vault02"
  
  retry_join {
    leader_api_addr = "https://vault01.ioresponse.com:443"
  }
  retry_join {
    leader_api_addr = "https://vault02.ioresponse.com:443"
  }
}

listener "tcp" {
  address     = "0.0.0.0:443"
  tls_cert_file = "/vault/certs/vault.crt"
  tls_key_file = "/vault/certs/vault.key"
}

api_addr = "https://vault02.ioresponse.com:443"
cluster_addr = "https://vault02.ioresponse.com:8201"
ui = true

4. SSL 인증서 설정

기존 인증서를 사용하는 경우 인증서와 키 파일을 적절한 위치에 복사하고 올바른 권한을 설정해야 합니다.

4.1 기존 인증서 적용 (YUM 설치)

bash# 인증서 및 키 파일 복사
sudo cp /path/to/your/cert.crt /etc/ssl/certs/vault.crt
sudo cp /path/to/your/private.key /etc/ssl/private/vault.key

# 권한 설정
sudo chown vault:vault /etc/ssl/certs/vault.crt
sudo chown vault:vault /etc/ssl/private/vault.key
sudo chmod 644 /etc/ssl/certs/vault.crt
sudo chmod 600 /etc/ssl/private/vault.key

# 서비스 재시작
sudo systemctl restart vault

4.2 Self-signed 인증서 생성 (필요한 경우)

bash# 개인키 생성
sudo openssl genrsa -out /etc/ssl/private/vault.key 4096

# CSR(Certificate Signing Request) 생성
sudo openssl req -new -key /etc/ssl/private/vault.key -out /tmp/vault.csr -subj "/CN=vault.ioresponse.com/O=IO Response/C=KR"

# 자체 서명 인증서 생성 (유효기간 10년)
sudo openssl x509 -req -days 3650 -in /tmp/vault.csr -signkey /etc/ssl/private/vault.key -out /etc/ssl/certs/vault.crt

# 권한 설정
sudo chown vault:vault /etc/ssl/certs/vault.crt
sudo chown vault:vault /etc/ssl/private/vault.key
sudo chmod 644 /etc/ssl/certs/vault.crt
sudo chmod 600 /etc/ssl/private/vault.key

# 임시 CSR 파일 삭제
sudo rm /tmp/vault.csr

# 서비스 재시작
sudo systemctl restart vault

5. Vault 초기화 및 FreeIPA(LDAP) 연동 설정

5.1 Vault 초기화

bash# Vault 환경변수 설정 (HTTPS 사용)
export VAULT_ADDR='https://127.0.0.1:443'
# 자체 서명 인증서를 사용하는 경우 인증서 검증 건너뛰기
export VAULT_SKIP_VERIFY=true

# Vault 초기화 (이중화 구성의 경우 첫 번째 서버에서만 실행)
vault operator init -key-shares=5 -key-threshold=3

# 나온 결과값을 안전하게 보관해야 합니다:
# Unseal Key 1: xxx
# Unseal Key 2: xxx
# Unseal Key 3: xxx
# Unseal Key 4: xxx
# Unseal Key 5: xxx
# Root Token: xxx

# Vault 언실링 (각 서버에서 실행)
vault operator unseal <Unseal Key 1>
vault operator unseal <Unseal Key 2>
vault operator unseal <Unseal Key 3>

# 루트 토큰으로 로그인
vault login <Root Token>

5.2 LDAP 인증 활성화 및 FreeIPA 연동

bash# LDAP 인증 활성화
vault auth enable ldap

# LDAP 인증 설정
vault write auth/ldap/config \
    url="ldap://ipasvo01.ioresponse.com" \
    userdn="cn=users,cn=accounts,dc=ioresponse,dc=com" \
    userattr="uid" \
    groupdn="cn=groups,cn=accounts,dc=ioresponse,dc=com" \
    groupattr="cn" \
    insecure_tls=true \
    starttls=false \
    binddn="uid=admin,cn=users,cn=accounts,dc=ioresponse,dc=com" \
    bindpass="StrongAdminPassword"

# 그룹 매핑 설정 (예: FreeIPA의 admins 그룹을 Vault의 admin 정책에 매핑)
vault write auth/ldap/groups/admins policies=admin

# 사용자 매핑 설정 (특정 사용자에게 직접 정책 적용)
vault write auth/ldap/users/admin policies=admin

5.3 Vault 정책 생성

bash# 관리자 정책 생성
cat > admin-policy.hcl <<EOF
# Admin policy
path "*" {
  capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}
EOF

vault policy write admin admin-policy.hcl

# 일반 사용자 정책 생성
cat > user-policy.hcl <<EOF
# User policy
path "secret/data/{{identity.entity.aliases.auth_ldap_7e9b2527.name}}/*" {
  capabilities = ["create", "read", "update", "delete", "list"]
}

path "secret/metadata/{{identity.entity.aliases.auth_ldap_7e9b2527.name}}/*" {
  capabilities = ["list"]
}
EOF

vault policy write user user-policy.hcl

# LDAP 일반 사용자 그룹에 정책 연결
vault write auth/ldap/groups/users policies=user

6. HAProxy를 이용한 Vault 로드 밸런싱 구성

이중화된 Vault 서버를 외부에 단일 엔드포인트로 제공하려면 HAProxy를 이용할 수 있습니다. SSL 트래픽 처리에는 두 가지 방식이 있습니다:

  1. TCP 모드(SSL 패스스루): HAProxy가 SSL을 종료하지 않고 암호화된 트래픽을 그대로 백엔드로 전달
  2. HTTP 모드(SSL 종료): HAProxy가 SSL을 종료하고 HTTP 트래픽을 백엔드로 전달

Vault는 주로 API 기반 통신이므로 SSL 패스스루 방식을 사용하는 TCP 모드가 효율적입니다.

bash# HAProxy 설치
sudo yum install -y haproxy

# HAProxy 설정 (TCP 모드 - SSL 패스스루)
sudo tee /etc/haproxy/haproxy.cfg > /dev/null <<EOF
global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

defaults
    mode                    tcp
    log                     global
    option                  tcplog
    option                  dontlognull
    option                  redispatch
    retries                 3
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    maxconn                 3000

frontend vault_frontend
    bind *:80
    mode tcp
    default_backend vault_backend
    
    # SSL 리디렉션
    redirect scheme https if !{ ssl_fc }

frontend vault_frontend_ssl
    bind *:443 ssl crt /etc/ssl/certs/haproxy.pem
    mode tcp
    option tcplog
    default_backend vault_backend_ssl

backend vault_backend
    mode tcp
    balance roundrobin
    option tcp-check
    server vault01 vault01.ioresponse.com:80 check
    server vault02 vault02.ioresponse.com:80 check

backend vault_backend_ssl
    mode tcp
    balance roundrobin
    option tcp-check
    server vault01 vault01.ioresponse.com:443 check
    server vault02 vault02.ioresponse.com:443 check
EOF

# HAProxy 인증서 생성 (PEM 형식 - 인증서와 키 결합)
cat /etc/ssl/certs/vault.crt /etc/ssl/private/vault.key > /etc/ssl/certs/haproxy.pem
sudo chmod 600 /etc/ssl/certs/haproxy.pem
sudo chown haproxy:haproxy /etc/ssl/certs/haproxy.pem

# HAProxy 활성화 및 시작
sudo systemctl enable haproxy
sudo systemctl start haproxy

대안으로 HTTP 모드(SSL 종료) 설정이 필요한 경우:

bash# HAProxy 설정 (HTTP 모드 - SSL 종료)
sudo tee /etc/haproxy/haproxy.cfg > /dev/null <<EOF
global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option                  http-server-close
    option                  forwardfor
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

frontend vault_frontend
    bind *:80
    mode http
    option httplog
    default_backend vault_backend
    
    # SSL 리디렉션
    redirect scheme https code 301 if !{ ssl_fc }

frontend vault_frontend_ssl
    bind *:443 ssl crt /etc/ssl/certs/haproxy.pem
    mode http
    option httplog
    default_backend vault_backend_ssl

backend vault_backend
    mode http
    balance roundrobin
    option httpchk GET /v1/sys/health
    http-check expect status 200
    server vault01 vault01.ioresponse.com:80 check
    server vault02 vault02.ioresponse.com:80 check

backend vault_backend_ssl
    mode http
    balance roundrobin
    option httpchk GET /v1/sys/health
    http-check expect status 200
    server vault01 vault01.ioresponse.com:443 check ssl verify none
    server vault02 vault02.ioresponse.com:443 check ssl verify none
EOF

7. 트러블슈팅 가이드

7.1 Vault 서비스 문제

증상: Vault 서비스가 시작되지 않음

해결방법:

bash# 로그 확인
sudo journalctl -u vault

# 포트 점유 확인 (443 포트가 이미 사용 중인지)
sudo netstat -tulpn | grep 443

# 권한 문제 해결
sudo chown -R vault:vault /opt/vault
sudo chown -R vault:vault /etc/ssl/certs/vault.crt
sudo chown -R vault:vault /etc/ssl/private/vault.key

# 설정 파일 문법 확인
vault operator validate -config=/etc/vault.d/vault.hcl

7.2 SSL/TLS 인증서 문제

증상: HTTPS 연결 오류 또는 인증서 관련 오류

해결방법:

bash# 인증서 정보 확인
openssl x509 -in /etc/ssl/certs/vault.crt -text -noout

# 인증서와 키가 일치하는지 확인
openssl x509 -noout -modulus -in /etc/ssl/certs/vault.crt | openssl md5
openssl rsa -noout -modulus -in /etc/ssl/private/vault.key | openssl md5

# 인증서 체인 확인
openssl verify /etc/ssl/certs/vault.crt

# 필요시 자체 서명 인증서로 테스트

7.3 LDAP 연동 문제

증상: LDAP 인증이 실패함

해결방법:

bash# Vault 로그 확인
sudo journalctl -u vault | grep ldap

# LDAP 연결 테스트
ldapsearch -x -H ldap://ipasvo01.ioresponse.com -D "uid=admin,cn=users,cn=accounts,dc=ioresponse,dc=com" -w "StrongAdminPassword" -b "cn=users,cn=accounts,dc=ioresponse,dc=com"

# LDAP 설정 업데이트
vault write auth/ldap/config \
    url="ldap://ipasvo01.ioresponse.com" \
    userdn="cn=users,cn=accounts,dc=ioresponse,dc=com" \
    userattr="uid" \
    groupdn="cn=groups,cn=accounts,dc=ioresponse,dc=com" \
    groupattr="cn" \
    insecure_tls=true \
    starttls=false \
    binddn="uid=admin,cn=users,cn=accounts,dc=ioresponse,dc=com" \
    bindpass="StrongAdminPassword" \
    upndomain="ioresponse.com"

7.4 Docker Compose 문제

증상: Docker Compose로 실행한 Vault 컨테이너가 시작되지 않음

해결방법:

bash# 컨테이너 로그 확인
docker logs vault

# 볼륨 권한 문제 해결
sudo chown -R 100:1000 ~/vault/data ~/vault/logs

# 인증서 경로 및 권한 확인
ls -la ~/vault/certs/
docker-compose config

7.5 80/443 포트 사용 문제

증상: Vault가 80/443 포트를 바인딩하지 못함

해결방법:

bash# 기존 서비스 확인 (Apache/Nginx 등이 이미 실행 중인지)
sudo netstat -tulpn | grep ':80\|:443'
sudo systemctl stop nginx  # 또는 apache2/httpd

# SELinux 설정 변경 (필요한 경우)
sudo setsebool -P nis_enabled 1

# 부팅 시 낮은 포트 바인딩 허용 (비루트 사용자)
sudo setcap 'cap_net_bind_service=+ep' /usr/bin/vault

7.6 Vault 이중화 문제

증상: Vault 이중화 노드가 클러스터에 조인되지 않음

해결방법:

bash# 클러스터 상태 확인
vault operator raft list-peers

# 방화벽 설정 확인
sudo firewall-cmd --list-all
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --permanent --add-port=8201/tcp
sudo firewall-cmd --reload

# 수동으로 노드 조인
# 두 번째 노드에서 아래 명령어 실행 (HTTPS 사용)
export VAULT_ADDR='https://127.0.0.1:443'
export VAULT_SKIP_VERIFY=true  # 자체 서명 인증서 사용 시
vault operator raft join https://vault01.ioresponse.com:443

8. 보안 강화 설정

8.1 감사 로그 활성화

bash# 감사 로그 파일 생성
sudo mkdir -p /var/log/vault
sudo chown vault:vault /var/log/vault

# 감사 로그 활성화
vault audit enable file file_path=/var/log/vault/audit.log

8.2 시스템 레벨 보안 강화

bash# 방화벽 설정
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --permanent --add-port=8201/tcp
sudo firewall-cmd --reload

# 서비스 계정 권한 제한
sudo useradd -r -d /opt/vault -s /bin/false vault
sudo chown -R vault:vault /opt/vault /etc/vault.d

# systemd 서비스 제한
sudo systemctl edit vault
ini[Service]
CapabilityBoundingSet=CAP_SYSLOG CAP_IPC_LOCK CAP_NET_BIND_SERVICE
PrivateTmp=yes
PrivateDevices=yes
ProtectSystem=full
ProtectHome=yes
NoNewPrivileges=yes

9. 백업 및 복원 계획

9.1 정기적인 백업 설정

bash# 백업 스크립트 생성
cat > /etc/cron.daily/vault-backup.sh <<EOF
#!/bin/bash
BACKUP_DIR="/backup/vault/\$(date +%Y%m%d)"
mkdir -p \$BACKUP_DIR
# Raft 스토리지 백업
vault operator raft snapshot save \$BACKUP_DIR/vault.snap
# 설정 파일 백업
cp -r /etc/vault.d \$BACKUP_DIR/config
# 권한 설정
chmod -R 600 \$BACKUP_DIR
EOF

# 실행 권한 부여
chmod +x /etc/cron.daily/vault-backup.sh

9.2 Vault 복원 절차

bash# 백업 스냅샷에서 복원
vault operator raft snapshot restore /backup/vault/20250420/vault.snap

10. 시스템 계정 관리 및 패스워드 통합

10.1 Vault를 통한 시스템 계정 패스워드 관리

Vault를 사용하여 Rocky Linux의 시스템 계정(root 포함)의 패스워드를 관리하고 자동으로 변경할 수 있습니다. 이를 위해 SSH 시크릿 엔진을 활용합니다.

bash# SSH 시크릿 엔진 활성화
vault secrets enable ssh

# root 계정 역할 생성
vault write ssh/roles/root key_type=otp default_user=root cidr_list=0.0.0.0/0

# SSH OTP 통합을 위한 설치 스크립트
curl -o /tmp/vault-ssh-helper.zip https://releases.hashicorp.com/vault-ssh-helper/0.2.1/vault-ssh-helper_0.2.1_linux_amd64.zip
unzip /tmp/vault-ssh-helper.zip -d /tmp
sudo mv /tmp/vault-ssh-helper /usr/local/bin/
sudo chmod 0755 /usr/local/bin/vault-ssh-helper

# PAM 설정 수정 (로컬 계정과 FreeIPA/LDAP 계정 모두 지원)
sudo tee /etc/pam.d/sshd > /dev/null <<EOF
#%PAM-1.0
# 로컬 시스템 계정용 Vault SSH Helper
auth [success=1 default=ignore] pam_exec.so quiet expose_authtok log=/var/log/vault-ssh.log /usr/local/bin/vault-ssh-helper -config=/etc/vault-ssh-helper.d/config.hcl
# FreeIPA/LDAP 계정 인증
auth sufficient pam_sss.so
# 일반 Unix 인증 (Vault에서 처리되지 않은 로컬 계정용)
auth sufficient pam_unix.so nullok try_first_pass

account    required     pam_nologin.so
# FreeIPA/LDAP 계정 검증
account    sufficient   pam_sss.so
# 로컬 계정 검증  
account    sufficient   pam_unix.so
account    required     pam_permit.so

# 패스워드 변경 설정
password   sufficient   pam_sss.so use_authtok
password   sufficient   pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password   required     pam_permit.so

# 세션 설정
session    required     pam_selinux.so close
session    required     pam_loginuid.so
session    required     pam_selinux.so open env_params
session    required     pam_namespace.so
session    optional     pam_keyinit.so force revoke
# FreeIPA/LDAP 세션 처리
session    optional     pam_sss.so
# 기본 세션 처리
session    required     pam_unix.so
EOF

# SSH 설정 수정
sudo sed -i 's/ChallengeResponseAuthentication no/ChallengeResponseAuthentication yes/g' /etc/ssh/sshd_config
sudo sed -i 's/UsePAM no/UsePAM yes/g' /etc/ssh/sshd_config
sudo systemctl restart sshd

# Vault SSH Helper 설정
sudo mkdir -p /etc/vault-ssh-helper.d/
sudo tee /etc/vault-ssh-helper.d/config.hcl > /dev/null <<EOF
vault_addr = "https://vault.ioresponse.com:443"
ssh_mount_point = "ssh"
namespace = ""
tls_skip_verify = false
ca_cert = "/etc/ssl/certs/vault.crt"
allowed_roles = "*"
EOF

위 설정은 다음과 같이 작동합니다:

  • OS에서 생성된 로컬 계정(root 등)은 Vault에서 관리하는 패스워드로 인증
  • FreeIPA/LDAP 계정은 FreeIPA 서버에서 관리되고 SSSD를 통해 인증
  • 인증 순서: Vault SSH Helper → FreeIPA/LDAP → 로컬 인증

10.2 자동 패스워드 순환 스크립트

다음 스크립트는 정기적으로 시스템 계정 패스워드를 변경하고 Vault에 저장합니다:

bash#!/bin/bash
# /usr/local/bin/rotate-system-passwords.sh

# 환경 변수 설정
export VAULT_ADDR='https://vault.ioresponse.com:443'
export VAULT_TOKEN='your-vault-token'

# 1. root 패스워드 생성 및 변경
NEW_PASSWORD=$(vault write -f ssh/creds/root ip=$(hostname -I | awk '{print $1}') | grep "^key" | awk '{print $2}')
echo "root:$NEW_PASSWORD" | sudo chpasswd

# 2. Vault에 새 패스워드 저장
vault kv put secret/system/$(hostname)/root password="$NEW_PASSWORD" timestamp="$(date -u +"%Y-%m-%dT%H:%M:%SZ")"

# 3. 다른 시스템 계정 처리 (예: admin 계정)
NEW_ADMIN_PASSWORD=$(openssl rand -base64 16)
echo "admin:$NEW_ADMIN_PASSWORD" | sudo chpasswd
vault kv put secret/system/$(hostname)/admin password="$NEW_ADMIN_PASSWORD" timestamp="$(date -u +"%Y-%m-%dT%H:%M:%SZ")"

echo "시스템 패스워드 변경 완료: $(date)"

cron 작업으로 스케줄링:

bash# 매월 1일 자정에 패스워드 변경
echo "0 0 1 * * /usr/local/bin/rotate-system-passwords.sh > /var/log/password-rotation.log 2>&1" | sudo crontab -

10.3 패스워드 검색 및 복구 스크립트

관리자가 Vault에서 시스템 계정 패스워드를 검색할 수 있는 스크립트:

bash#!/bin/bash
# /usr/local/bin/get-system-password.sh

# 사용법 확인
if [ $# -lt 2 ]; then
  echo "사용법: $0 <호스트명> <계정명>"
  exit 1
fi

HOST=$1
ACCOUNT=$2

# 환경 변수 설정
export VAULT_ADDR='https://vault.ioresponse.com:443'

# 토큰이 없을 경우 로그인 요청
if [ -z "$VAULT_TOKEN" ]; then
  echo "Vault 토큰이 필요합니다."
  echo "vault login 명령어로 먼저 로그인하세요."
  exit 1
fi

# Vault에서 패스워드 조회
RESULT=$(vault kv get -format=json secret/system/$HOST/$ACCOUNT)
if [ $? -ne 0 ]; then
  echo "패스워드를 찾을 수 없습니다. 호스트명과 계정명을 확인하세요."
  exit 1
fi

# 패스워드 및 타임스탬프 추출
PASSWORD=$(echo $RESULT | jq -r '.data.data.password')
TIMESTAMP=$(echo $RESULT | jq -r '.data.data.timestamp')

echo "==================================="
echo "호스트: $HOST"
echo "계정: $ACCOUNT"
echo "마지막 변경: $TIMESTAMP"
echo "패스워드: $PASSWORD"
echo "==================================="

실행 권한 부여:

bashchmod +x /usr/local/bin/get-system-password.sh

10.4 운영 관리 스크립트

bash# 상태 확인 스크립트
cat > /usr/local/bin/check-vault.sh <<EOF
#!/bin/bash
export VAULT_ADDR='https://127.0.0.1:443'
export VAULT_SKIP_VERIFY=true

# Vault 상태 확인
STATUS=\$(vault status -format=json 2>/dev/null)
if [ \$? -ne 0 ]; then
  echo "ERROR: Vault 서비스에 접근할 수 없습니다."
  exit 1
fi

# 언실링 여부 확인
SEALED=\$(echo \$STATUS | jq -r '.sealed')
if [ "\$SEALED" == "true" ]; then
  echo "WARNING: Vault가 sealed 상태입니다."
  exit 1
fi

# 리더 확인 (HA 모드)
HA_ENABLED=\$(echo \$STATUS | jq -r '.ha_enabled')
if [ "\$HA_ENABLED" == "true" ]; then
  LEADER=\$(echo \$STATUS | jq -r '.leader_address')
  echo "INFO: 클러스터 리더: \$LEADER"
fi

echo "INFO: Vault가 정상 동작 중입니다."
exit 0
EOF

# 실행 권한 부여
chmod +x /usr/local/bin/check-vault.sh

10.5 주요 운영 명령어 모음

bash# 토큰 갱신
vault token renew

# 정책 목록 확인
vault policy list

# 인증 방법 목록 확인
vault auth list

# 시크릿 엔진 목록 확인
vault secrets list

# 리스 갱신
vault lease renew <lease_id>

# PKI 인증서 발급
vault write pki/issue/example-dot-com common_name="test.example.com"

# 시스템 패스워드 조회
./get-system-password.sh server01 root
이 글이 유익했다면 공유해주세요❤️
코드 걷는 사람
코드 걷는 사람
Articles: 9

Leave a Reply

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 Akismet을 사용하여 스팸을 줄입니다. 댓글 데이터가 어떻게 처리되는지 알아보세요.