안녕하세요, 오늘은 지난 포스트에서 다루었던 리눅스 환경의 중앙 집중식 사용자 인증 및 권한 관리 시스템인 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 트래픽 처리에는 두 가지 방식이 있습니다:
- TCP 모드(SSL 패스스루): HAProxy가 SSL을 종료하지 않고 암호화된 트래픽을 그대로 백엔드로 전달
- 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