• Ansible Vault는 패스워드, 키와 같은 보안에 민감한 파일들을 encryption / decryption 해주는 기능을 가짐(암호화)
  • Ansible-Vault는 변수와 파일을 암호화하여 플레이북이나 role에서 비밀번호. 키와 같은 민감한 콘텐츠를 보호 가능
  • Ansible을 이용할 때 해킹이나, 유출로 인해 서버 정보가 외부로 나갈 수 있음
  • Ansible Vault를 통해 민감한 정보를 평문이 아니라 암호화된 파일로 관리하면 해킹당해도 문제 X
  • SSH 개인 및 공개 키, 암호 및 SSL 인증서도 암호화된 파일로 관리하여 권한 없는 사람이 권한을 얻는 것을 방지
  • Ansible Vault를 이용하면 Ansbile에서 사용하는 모든 구조화된 데이터 파일을 암호화 가능
  • Ansible Vault는 변수 또는 전체 파일 및 YAML 플레이 북을 암호화 → 파일을 암호화하고 복호화 할 때 동일한 암호를 요구

1. Ansible-Vault 설치

  • Ansible을 설치하면 Ansible-vault도 함께 설치됨

  • 암호화 알고리즘 : AES256

    $ ansible-vault -h
    usage: ansible-vault [-h] [--version] [-v]
                         {create,decrypt,edit,view,encrypt,encrypt_string,rekey}
                         ...
    
    encryption/decryption utility for Ansible data files
    
    positional arguments:
      {create,decrypt,edit,view,encrypt,encrypt_string,rekey}
        create              Create new vault encrypted file
        decrypt             Decrypt vault encrypted file
        edit                Edit vault encrypted file
        view                View vault encrypted file
        encrypt             Encrypt YAML file
        encrypt_string      Encrypt a string
        rekey               Re-key a vault encrypted file
    
    optional arguments:
      --version             show program's version number, config file location,
                            configured module search path, module location,
                            executable location and exit
      -h, --help            show this help message and exit
      -v, --verbose         verbose mode (-vvv for more, -vvvv to enable
                            connection debugging)
    
    See 'ansible-vault <command> --help' for more information on a specific
    command.



2. 암호화되지 않은 파일을 암호화 (../vars/main.yml 파일 암호화)

  • 기존에 가지고 있는 파일을 암호화함으로 알수 없는 문자로 이루어진 파일 생성 (Plain text → Encrypt text)

  • 암호화할때 AES256 암호화 표준을 사용

  • 암호화된 파일의 key를 1234로 함

  • 실전에서는 보다 복잡하게 생성해야하지만, 해당 key의 비밀번호를 담고있는 암호화 파일을 추가로 생성하여 vault password 입력할때 활용하는 테스트를 위해 단순하게 생성

    # 암호화할 파일의 내용 확인
    $ vi ../vars/main.yml
    ---
    #사용자 목록
    root_user: "root"
    hippo_user: "hippo"
    
    #변경하고자하는 id의 비밀번호 -> 비밀번호 부분은 ####으로 표시
    root_newpasswd: "########"
    hippo_newpasswd: "########"
    
    # ../var/main.yml 파일을 암호화하여 새로운 암호화 파일 생성
    $ ansible-vault encrypt ../vars/main.yml
    New Vault password:
    Confirm New Vault password:
    Encryption successful
    
    # ../vars/main.yml 파일이 암호화되어있음을 확인 가능
    $ cat ../vars/main.yml
    $ANSIBLE_VAULT;1.1;AES256
    33363235653433386533393236363138376133666234623535313431373835323563323230653838
    3036383965373264646262316464306137623333656435370a333162616433653761336332343439
    61323933646137666663616231613539393264363032613137393538343837393838306231383861
    6265323931656562340a316539306433363436613262393633623463626361303339396430386465
    30326638623336386133303136396431336662326639623439653035373363643966633161656666
    65613632353539616365666530313532373530613239373632316532613838643434623962366332
    31333834613237633134316332343437323063386234643063303464393365326133636462356266
    63343662363237633365646535333733623966323735343865656536626664613263353332393263
    31396361303533663463313832333362353732663939616539616131653533383331343064623961
    38303966393434323266643133323635323461653265633338306430323566373236643662356565
    62326336353336613937623738323861333636336234623030376434316564386131363639643739
    38653764376634613636356665383830306230356364323932373734363831333030313730656464
    31383231653330393764323638393034646539646366336438386533323534336631336133333337
    62626434343532636338613339333739396231643934616135363836323961303032626661303737
    62313433343236636134396136633566343165343963663462336531343162383361396536313434
    35333064313739623464



3. 암호화한 ../vars/main.yml 파일이 이상없이 roles에서 적용가능한지 테스트

  • 비밀번호를 변경하는 roles

  • 암호화한 ../vars/main.yml 을 활용하기 위해서는 키가 필요

  • 키를 수동으로 입력하기 위해서는 옵션을 넣어야함(--ask-vault-pass)

  • --ask-vault-pass 옵션이 없는 경우 ansible-vault로 암호화된 파일을 읽을 수 없어서 에러 발생

    # 아래와 같이 일반 암호와 vault 암호를 같이 입력해야함 -> 정상 실행됨으로 실행 내용은 생략
    # Vault password에 들어갈 비밀번호는 "1234"
    $ ansible-playbook change_passwd_role.yml -k --ask-vault-pass
    SSH password:
    Vault password:
    
    PLAY [change passwd Role] *******************************************************************
    [...생략]



4. 암호화된 파일을 복호화 (../vars/main.yml 파일 복호화)

  • 암호화된 파일을 Plain text 파일로 복호화 (Encrypt text → Plain text)

  • 복호화할때 AES256 암호화 표준을 사용

  • 암호화된 파일에 key를 1234로 하여 복호화

    # 암호화된 ../var/main.yml 파일을 복호화하여 기존 파일으로 변경
    $ ansible-vault decrypt ../vars/main.yml
    Vault password:
    Decryption successful
    
    # 암호화된 ../vars/main.yml 파일이 복호화되어있음을 확인 가능
    $ cat ../vars/main.yml
    ---
    #사용자 목록
    root_user: "root"
    hippo_user: "hippo"
    
    #변경하고자하는 id의 비밀번호 -> 비밀번호 부분은 ####으로 표시
    root_newpasswd: "########"
    hippo_newpasswd: "########"



5. 암호화 키 제작 → 암호화할 파일의 키를 암호화

  • 암호화할 파일의 키는 "1234" → 중요한 정보를 암호화할 때 사용할 키

  • 암호화할 파일의 키를 복호화할 키는 "9876" → 암호화한 키의 내용이 복호화되면 암호화된 정보까지 도달할 수 있기에 이 부분도 복잡하게 하는 것이 중요 (테스트이기에 단순하게 적용)

  • 중요한 정보를 암호화할 키를 Plain text로 공유하면 관리에서 문제가 발생할 수 있음 → 암호화된 키로 공유하여 관리 문제 해결

    # vault password는 vault_key 파일의 키 -> 복호화할때 사용
    $ ansible-vault create ../vars/vault_key
    New Vault password:
    Confirm New Vault password:
    
    # 1234로 입력하고 wq!으로 저장하면 ../vars/vault_key 파일 생성
    1234
    
    # ../vars/vault_key 파일의 내용 확인 -> 해당 내용으로 암호화가 필요한 중요 파일을 암호화
    $ cat ../vars/vault_key
    $ANSIBLE_VAULT;1.1;AES256
    61336134633736613130643539316264356339333261623865356261366465623065613436313064
    3263356335363463623362646333366338613764643932300a303635663930653934313931303966
    37316437336635333137336330616264623264393831316537303434376138373463393361373936
    6132636239613263350a363863343233656164343832663965353433393136343465383933656636
    3962



6. 중요 파일을 암호화된 키로 암호화 → 암호화된 키 공유하여 ansible 활용

  • 암호화 키를 공유해도 해당 키의 암호키를 모르기에 문제 X

  • 중요한 파일을 암호화할 때 해당 암호화된 파일 활용 → 이전에 Plain text로 "1234" 입력하는 것과 동일 효과

  • 암호화된 키를 활용하기 위해서는 vault-password-file 옵션 사용

  • 해당 이슈 내용은 ansible 버전 업그레이드로 ansible-vault를 통해서 암호화된 파일은 ansible-vault키로 사용 X → 해결 방법으로는 6.1 부분과 6.2 부분를 보고 괜찮은 부분을 따라서 하면됨

  • ansible-vault로 encrypt한 ../vault_key 파일을 활용하여 ../main.yml 파일을 암호화할 때 문제 발생

    $ ansible-vault encrypt ../vars/main.yml --vault-password-file ../vars/vault_key
    
    # 이슈 내용: ansible-vault를 통해서 생성한 암호화 파일을 ansible-vault의 키로 사용할 경우 아래와 같은 에러가 발생함
    [WARNING]: Error in vault password file loading (default): A vault password must be specified to decrypt data
    ERROR! A vault password must be specified to decrypt data

6.1. 생성한 AES256 암호화 파일을 ansible-vault에서 볼트 암호화 파일로 인식하지 못하게 하기

  • vault_key 파일 확인
    $ cat ../vars/vault_key
    $ANSIBLE_VAULT;1.1;AES256
    61336134633736613130643539316264356339333261623865356261366465623065613436313064
    3263356335363463623362646333366338613764643932300a303635663930653934313931303966
    37316437336635333137336330616264623264393831316537303434376138373463393361373936
    6132636239613263350a363863343233656164343832663965353433393136343465383933656636
    3962
  • vault_key 파일 내용 변경 → 출력되는 내용 중에 $(달러 기호)를 삭제
    $ vi ../vars/vault_key
    ANSIBLE_VAULT;1.1;AES256
    61336134633736613130643539316264356339333261623865356261366465623065613436313064
    3263356335363463623362646333366338613764643932300a303635663930653934313931303966
    37316437336635333137336330616264623264393831316537303434376138373463393361373936
    6132636239613263350a363863343233656164343832663965353433393136343465383933656636
    3962
  • vault_key를 평문으로 인식 → ../vars/vault_key 파일을 통해 ../vars/main.yml 파일을 암호화 복호화 테스트

    # 암호화 테스트
    $ ansible-vault encrypt ../vars/main.yml --vault-password-file ../vars/vault_key
    Encryption successful
    
    # 암호화가 정상적으로 진행되었는지 확인
    $ cat ../vars/main.yml
    $ANSIBLE_VAULT;1.1;AES256
    63643230343061333339313964343937336632386364663935643736313333336238663932323865
    3730326361663139626232386562653962396263343931310a333161343061376331306530303736
    36663832626133353932383464323539656431373563613563653230623136343963306230623962
    6538353330343666380a396639323235653465356336346135646562616161306333313033336562
    65333766643234633633633532623062393033636233643534336138366465326237333932643333
    30353563343337643031353966366264383264356562316234393331393832656162653933343136
    38646331333238633766393036336431366634643863323234353133643031653033663037356236
    61393162386637326437623164323364666330613636666462366465363764663364666330303566
    36306433366539623433386434616238663063633734656131316434323332623735346335616266
    61303838393239643834343362386331386534343339313265663334323035653665616632363661
    38376433643239323564616162666535393431326533643432396466633034646562396134356437
    39626134346565326533393836653634316536633164616164393436316330323331336239336665
    64383238383930613930653065386631343933633462383966313236666532353334343137333632
    66643462626164616339303064633733303734653735313862653165633762353430313136386463
    33663434306566323161386630376130333865343238613736356332383862323765303634643732
    66383134383439356361
    
    # 복호화 테스트
    $ ansible-vault decrypt ../vars/main.yml --vault-password-file ../vars/vault_key
    Decryption successful
    
    # 복호화가 정상적으로 진행되었는지 확인
    $ cat ../vars/main.yml
    ---
    #사용자 목록
    root_user: "root"
    hippo_user: "hippo"
    
    #변경하고자하는 id의 비밀번호 -> 비밀번호 부분은 ####으로 표시
    root_newpasswd: "########"
    hippo_newpasswd: "########"

6.2. vault가 아닌 openssl을 이용하여 난수로 작성된 vault_key_by_ssl 파일 생성

  • openssl 명령어를 실행하여 vault_key_by_ssl 이라는 암호화된 파일 생성 → vault_key_by_ssl 파일로 main.yml 파일을 암호화하는 키로 활용
    # ../vars/vault_key_by_ssl 파일이름으로 암호화된 파일 생성(ansible-vault를 활용하지 않지만, openssl로 암호화한 key 활용)
    $ openssl rand -base64 2048 > ../vars/vault_key_by_ssl
  • 생성한 vault_key_by_ssl 확인
    # 암호화된 파일 내용 출력
    $ cat ../vars/vault_key_by_ssl
    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
  • 새로 생성한 vault_key_by_ssl 파일을 이용해서 ../vars/main.yml 파일을 암호화

    # 암호화 테스트
    $ ansible-vault encrypt ../vars/main.yml --vault-password-file ../vars/vault_key_by_ssl
    Encryption successful
    
    # 암호화된 ../vars/main.yml 파일 내용 확인
    $ cat ../vars/main.yml
    $ANSIBLE_VAULT;1.1;AES256
    33303566376566653234393138636562663863393431646566333262643232383862383439626531
    6433303938363137623762316234666163383238383136320a333238623731333539353065313666
    63633864663763346263663564646561666534343137616139373564363964396131343863363263
    6366663236613735320a333264323761353230306239346663656466663638323961396364323138
    35636665333737643838616161343835363732356536633833646431323465646131393432373863
    35653939326435626464373036633531303466356164656437323039343435613532653531636231
    35356237663464306566663463613939313433333031633736323165663839306266376334636336
    39356537323930656263313037396531663961396162333162613765356265653135336535316366
    39666432363036646364613165346461363830613032323961396563643466663633613635343633
    62396536656562303365346563626338353234303161306432333430303662346166353133353230
    39613636666165626362366637633061396266636561646463363966306135323835666536393765
    34316662396265336365383462643932366532663132616361396238396561663166386532636264
    64626266373266326266363739653633623664353765336136356539323665336265653461666466
    33393462633138346638313866643132346239643061353131326132336134653737646565636262
    35356131343362383532353232346430643237383165353132616133643630373466383761323030
    38333061313761373938
    
    # vault_key_by_ssl 파일을 이용해서 ../vars/main.yml 파일을 복호화
    $ ansible-vault decrypt ../vars/main.yml --vault-password-file ../vars/vault_key_by_ssl
    Decryption successful
    
    # 복호화가 정상적으로 진행되었는지 확인
    $ cat ../vars/main.yml
    ---
    #사용자 목록
    root_user: "root"
    hippo_user: "hippo"
    
    #변경하고자하는 id의 비밀번호 -> 비밀번호 부분은 ####으로 표시
    root_newpasswd: "########"
    hippo_newpasswd: "########"



7. 생성된 암호화 키 파일인 ../vars/vault_key과 ../vars/vault_key_by_ssl를 활용하여 ../vars/main.yml 파일을 암호화 → roles에서 적용가능한지 테스트

  • 암호화된 키 파일을 활용 → 6.1과 6.2 중 하나를 이용하면 됨

  • 암호화된 키 파일을 통해서 ../vars/main.yml 파일 암호화

  • roles를 이용하여 암호화된 파일이 이상 없는 지 확인 필요

  • --vault-password-file 옵션을 사용하여 암호화된 키 피일을 적용 → 암호화된 키를 통해 중요한 데이터가 암호화되어야만 정상 roles 작동

  • --vault-password-file 옵션으로 암호화된 파일을 적용하는 것은 문제 없으나, SSH 접속에는 비밀번호가 필요함으로 SSH password 부분에 적합한 비밀번호 적용 필요

  • 해당 부분도 암호화로 변경하여 자동화 할수 있지만, 해당 파일의 목적이 비밀번호 변경임으로 비밀번호 확인 차원에서 SSH 접속 비밀번호는 수동으로 남겨놓음

    # Vault password에 들어갈 비밀번호를 암호화된 파일을 이용하여 적용 -> --vault-password-file 옵션 활용
    # 정상 실행됨으로 실행 내용은 생략
    # 파일 경로는 직접 확인하여 적용 필요
    $ ansible-playbook change_passwd_role.yml -k --vault-password-file ../vars/vault_key
    SSH password:
    
    PLAY [change passwd Role] *******************************************************************
    [...생략]

※ ansible vault의 참고 사항

1. 암호화된 파일의 패스워드 변경하기

$ ansible-vault rekey ../vars/main.yml

2. 암호화된 파일의 내용 보기

$ ansible-vault view ../vars/main.yml


Vault로 유효 기간이 존재하는 인증서 관리

  • 인증서를 직접 발급 수행하는 것은 매우 번거러운일
  • Vault를 사용하면 SSH 인증서를 매우 쉽게 관리하고 발급 가능

Vault를 사용하기 위해서는 모든 클라이언트 Server에 Vault가 설치 필요

1. hashicorp_vault 설치

$ yum install -y yum-utils
$ yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
$ yum -y install vault

2. hashicorp_vault 설치 확인

$ vault -v



Vault 서버 기본 설정

1. Vault SSH secret engine 활성화

$ vault secrets enable -path=ssh-client-signer ssh
Success! Enabled the ssh secrets engine at: ssh-client-signer/

# SSH secret enbine 생성 확인
$ vault secrets list
Path                       Type         Accessor              Description
----                        ----          --------                 -----------
ssh-client-signer/     ssh          ssh_241cbffa         n/a

2. SSH CA 생성

$ vault write ssh-client-signer/config/ca generate_signing_key=true
Key              Value
---                -----
public_key    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDALoH6ItfBjGnqNJAwFa1xUzOJ38WVosCNZQ3o2BlFJxhXvejU1CalDQDCZXEK8SIxeOqKC3mu/nIGMLYR5lwWRgl5r3janyLw8174MSM1wgSy9ZcURZrivicafKrH2WQAXJ6TKsrlhR5GODwxRCciD02l8LgbvaBs8pt1SRmvCc17xBAMuwu/A0pBU+tHotfiBqeLlQThi2mhpRSZ9u2cIt4neP/g+1/hMDxjlhmge7ehQBNYyWc2n8HDubCYT+z2GANk8vk6DhXs5iaLozM1lALXQZlbK3MpIVh1HySnIewuw3rjgBlOc9sJMcrnQYdrb/EnJzLrcL4Sb4NmzB5gPW29vTc0Thkt4T4ghTCriOLCFjKihlc9sO8rsZ6fV10i/qfUONcrZYp1wVS18WOKQEBblgXp94L/Kl/mRVHFRicNDSVsZij9pHZovRprE3RkqO87qF67ZhcL3yzAVfkoRrWqDzG5PFpjGHLa3mV3nmL1vBKhL9/tkxbxz6svWkPYFSbxZx+JRSzzp3VPqFzSEiBmFNloCCVZfdSUMi5RlAD7r2NaCUR0+tXf0Io/YzXDuzMWk4Gq0FbJ+LWgfo1mXpj+iElmW4YS+oI6jyLVyQZEHZMvGcdiXyIZI76cdvqsjWL2C5e7O7p0ktTFmZfiBxHUUt3FbVZ+PqXk6H86uQ==

3. SSH Server에서 key를 read할 수 있도록 정책 설정

$ vi /vault/config/policy/ssh_policy.tf
path "ssh-client-signer/config/ca" {
  capabilities = ["read"]
}

4. SSH Server에서 key를 read할 수 있도록 정책 적용

$ cd /vault/config/policy/
$ vault policy write ssh-pubkey-read ssh_policy.tf
Success! Uploaded policy: ssh-pubkey-read

# SSH 정책 확인
$ vault policy list
default
ssh-pubkey-read

5. SSH Server에서 VAULT 서버로 접속할 Token 생성 → VAULT의 token값을 사용하기 위해서는 별도 저장 필요

$ vault token create -policy=ssh-pubkey-read
Key                        Value
---                         -----
token                     s.fX6YPfJI8xvi8NKZiI8O12UF
token_accessor       aUTigEQ0p2oNwoLUA8jMjWr6
token_duration       768h
token_renewable     true
token_policies         ["default" "ssh-pubkey-read"]
identity_policies      []
policies                   ["default" "ssh-pubkey-read"]

※ ssh-server에서 export 시켜주면 Vault 서버에서 SSH 인증서 public 키를 가져올 수 있음


6. SSH Client에서 Vault에 CA 사인 요청할 수 있도록 생성

  1. default_user
    • SSH 로그인에 사용될 유저 이름
    • default_user로 hippo 유저로 고정
    • 여러 사용자에 대해 허용할 것이라면 valid_principals 항목을 따로 정의해서 사용 필요
  1. ttl

    • CA가 사인한 키의 유효 기간을 의미

    • role을 통해 생성된 SSH 키는 5분 동안만 유효

      $ vault write ssh-client-signer/roles/my-role -<<"EOF"
      {
        "allow_user_certificates": true,
        "allowed_users": "*",
        "default_extensions": [
          {
            "permit-pty": ""
          }
        ],
        "key_type": "ca",
        "default_user": "hippo",
        "ttl": "5m0s"
      }
      EOF
      Success! Data written to: ssh-client-signer/roles/my-role

7. SSH Client에서 Vault에 CA 사인 update할 수 있도록 정책 설정

$ /vault/config/policy/
$ vi /vault/config/policy/sign_policy.tf
path "ssh-client-signer/sign/my-role" {
  capabilities = ["update"]
}

8. SSH Client에서 Vault에 CA 사인 update할 수 있도록 정책 적용

$ vault policy write require-ssh-sign sign_policy.tf
Success! Uploaded policy: require-ssh-sign

# 생성된 정책 확인
$ vault policy list
default
require-ssh-sign

9. SSH Client에서 VAULT 서버로 접속할 Token 생성 → VAULT의 token값을 사용하기 위해서는 별도 저장 필요

$ vault token create -policy=require-ssh-sign
Key                         Value
---                          -----
token                      s.HI8wvigrGvJuhUsk1H9ANmcl
token_accessor        0jom4yW0a8Nb4Cvw85NVCRtv
token_duration        768h
token_renewable      true
token_policies          ["default" "require-ssh-sign"]
identity_policies       []
policies                    ["default" "require-ssh-sign"]

※ ssh-client에서 export 시켜주면 Vault에서 CA 사인할 수 있는 public 키를 가져올 수 있음



SSH Server 설정 → SSH를 통해 접속하는 대상 서버

1. SSH Server에서 Vault server 접근할 수 있도록 환경변수 설정

  • VAULT_TOKEN 값은 SSH-Server에서 key를 read할 수 있도록 정책 설정 → s.fX6YPfJI8xvi8NKZiI8O12UF

  • VAULT 접속 도메인 설정 → [테스트 도메인]:8200

    # 환경 변수 적용
    export VAULT_ADDR=https://[테스트 도메인]:8200
    export VAULT_TOKEN=s.fX6YPfJI8xvi8NKZiI8O12UF
    
    # 영구적인 환경 변수 적용
    $ echo -e "\n#SSH\nexport VAULT_ADDR=https://[테스트 도메인]:8200" >> /etc/bashrc
    $ echo -e "export VAULT_TOKEN=s.fX6YPfJI8xvi8NKZiI8O12UF" >> /etc/bashrc

2. Vault server에서 CA의 public Key를 SSH Server에 전송

  • Vault server에서 public key 추출

      $ vault read -field=public_key ssh-client-signer/config/ca > /root/trusted-user-ca-keys.pem
    
      # 생성한 CA의 public key 확인
      $ cat /root/trusted-user-ca-keys.pem
      ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDALoH6ItfBjGnqNJAwFa1xUzOJ38WVosCNZQ3o2BlFJxhXvejU1CalDQDCZXEK8SIxeOqKC3mu/nIGMLYR5lwWRgl5r3janyLw8174MSM1wgSy9ZcURZrivicafKrH2WQAXJ6TKsrlhR5GODwxRCciD02l8LgbvaBs8pt1SRmvCc17xBAMuwu/A0pBU+tHotfiBqeLlQThi2mhpRSZ9u2cIt4neP/g+1/hMDxjlhmge7ehQBNYyWc2n8HDubCYT+z2GANk8vk6DhXs5iaLozM1lALXQZlbK3MpIVh1HySnIewuw3rjgBlOc9sJMcrnQYdrb/EnJzLrcL4Sb4NmzB5gPW29vTc0Thkt4T4ghTCriOLCFjKihlc9sO8rsZ6fV10i/qfUONcrZYp1wVS18WOKQEBblgXp94L/Kl/mRVHFRicNDSVsZij9pHZovRprE3RkqO87qF67ZhcL3yzAVfkoRrWqDzG5PFpjGHLa3mV3nmL1vBKhL9/tkxbxz6svWkPYFSbxZx+JRSzzp3VPqFzSEiBmFNloCCVZfdSUMi5RlAD7r2NaCUR0+tXf0Io/YzXDuzMWk4Gq0FbJ+LWgfo1mXpj+iElmW4YS+oI6jyLVyQZEHZMvGcdiXyIZI76cdvqsjWL2C5e7O7p0ktTFmZfiBxHUUt3FbVZ+PqXk6H86uQ==
    
      # scp를 통해 /etc/ssh 디렉토리 아래로 trusted-user-ca-keys.pem 파일 이동
      $ ls -al /etc/ssh/trusted-user-ca-keys.pem
      -rw-r--r-- 1 root root 725 Mar  1 17:39 /etc/ssh/trusted-user-ca-keys.pem

3. SSH 설정 → TrustedUserCAKeys /etc/ssh/trusted-user-ca-keys.pem 설정

$ vi /etc/ssh/sshd_config
Port 22000
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

# TrustedUserCAKeys 추가
TrustedUserCAKeys /etc/ssh/trusted-user-ca-keys.pem

4. SSH 재시작 및 상태 확인

$ systemctl restart sshd

# 상태 확인
$ systemctl status sshd
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2022-03-01 17:47:07 KST; 3s ago
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 62539 (sshd)
    Tasks: 1
   Memory: 1.0M
   CGroup: /system.slice/sshd.service
           └─62539 /usr/sbin/sshd -D



SSH Client 설정 → SSH 서버에 접속하는 SSH 클라이언트 서버

1. SSH Client에서 Vault server 접근할 수 있도록 환경변수 설정

  • VAULT_TOKEN 값은 SSH-Client에서 Vault Server에 CA사인 요청할 수 있도록 정책 설정 → s.HI8wvigrGvJuhUsk1H9ANmcl

  • VAULT 접속 도메인 설정 → https://[테스트 도메인]:8200

      # 환경 변수 적용
      export VAULT_ADDR=https://[테스트 도메인]:8200
      export VAULT_TOKEN=s.HI8wvigrGvJuhUsk1H9ANmcl
    
      # 영구적인 환경 변수 적용
      echo -e "\n#SSH\nexport VAULT_ADDR=https://[테스트 도메인]:8200" >> /etc/bashrc
      echo -e "export VAULT_TOKEN=s.HI8wvigrGvJuhUsk1H9ANmcl" >> /etc/bashrc

2. SSH key 생성 → 모두 enter로 넘어감

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:ubVlwjtNjjxM9xoOdw6h8rSTF+zGfTeGt64/E1FIUwU root@180-70-134-115
The key's randomart image is:
+---[RSA 2048]----+
|             .E++|
|              ...|
|                .|
|         o     . |
|        S =.*   .|
|         * &oo . |
|        o %+*o+ .|
|         +oB=B.*o|
|          o+o.B=*|
+----[SHA256]-----+

3. 생성한 key를 Vault server에 사인 요청하고 응답 결과 key를 저장

$ vault write -field=signed_key ssh-client-signer/sign/my-role public_key=@/root/.ssh/id_rsa.pub > /root/.ssh/id_rsa-cert.pub

# id_rsa.pub에 사인 요청을 해서 접속 확인
$ cat /root/.ssh/id_rsa-cert.pub
ssh-rsa-cert-v01@openssh.com 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

4. SSH Client 에서 SSH Server로 접속 확인 → 결과 정상 접속

$ ssh -p 22000 hippo@[SSH 접속 서버 IP]
Last login: Tue Mar  1 17:59:26 2022 from [SSH 클라이언트 서버 IP]

5. 5분뒤 접속 가능한지 확인 → Vault server에서 sign 유효 시간을 5분으로 설정

  • test하기 위해 5분 뒤에 생성했던 id_rsa-cert.pub로 접속 시도 → 실패

  • 인증서 서명 유효기간이 만료되어 password로 접속 시도 하는 것을 확인 → 직접 비밀번호를 모르기에 오류 발생

  • 새롭게 id_rsa-cert.pub을 생성한 후에 다시 로그인 시도

    $ ssh -p 22000 hippo@[SSH 접속 서버 IP]
    no such identity: /root/.ssh/id_ed25519: No such file or directory
    hippo@[SSH 접속 서버 IP]'s password:
    
    # 새롭게 인증서 만들어서 로그인 시도
    $ vault write -field=signed_key ssh-client-signer/sign/my-role public_key=@/root/.ssh/id_rsa.pub > /root/.ssh/id_rsa-cert.pub
    $ ssh -p 22000 hippo@[SSH 접속 서버 IP]
    Last login: Tue Mar  1 17:59:55 2022 from [SSH 클라이언트 서버 IP]

Vault audit log(감사 로그)를 /var/log/ 아래의 파일에 기록하도록 설정

  • /var/log/vault_audit.log 파일에 기록, 수정 가능
    $ vault audit enable file file_path=/var/log/vault_audit.log
    Success! Enabled the file audit device at: file/


Vault audit log(감사 로그) 리스트를 조회

  • audit 로그 생성 위치와 type을 확인 가능
    $ vault audit list
    Path     Type    Description
    ----      ----       -----------
    file/     file       n/a


생성된 /var/log/vault_audit.log 파일 내용 확인

  • vault server 동작 내용 확인 가능
    $ cat /var/log/vault_audit.log
    {"time":"2022-02-28T05:16:33.223325954Z","type":"request","auth":{"token_type":"default"},"request":{"id":"f95c9fd1-8414-5a4f-316c-0631b936e8f0","operation":"update","namespace":{"id":"root"},"path":"sys/audit/test"}}
    # [...생략...]

  • root token : s.asQ2M2u8kefJAH7pTRK9VZuY
  • sealing된 vault에는 루트 토큰(root token)으로도 로그인 불가

unseal된 Vault 서버에 로그인

$ vault login
Token (will be hidden):
WARNING! The VAULT_TOKEN environment variable is set! This takes precedence
over the value set by this command. To use the value set by this command,
unset the VAULT_TOKEN environment variable or set it to the token displayed
below.

Success! You are now authenticated. The token information displayed below
is already stored in the token helper. You do NOT need to run "vault login"
again. Future Vault requests will automatically use this token.

Key                         Value
---                           -----
token                       s.asQ2M2u8kefJAH7pTRK9VZuY
token_accessor         DhyddellBSpndis790yPJCIp
token_duration         ∞
token_renewable       false
token_policies           ["root"]
identity_policies        []
policies                     ["root"]



Sealing된 상태에서 Vault 서버에 로그인 → 로그인 시 에러 발생

$ vault login
Token (will be hidden):
Error authenticating: error looking up token: Error making API request.

URL: GET https://[테스트 도메인]:8200/v1/auth/token/lookup-self
Code: 503. Errors:

* Vault is sealed

  • Vault 서버는 sealed(봉인) 상태로 시작 → sealed(봉인) 상태는 저장된 정보를 어떤 경우에도 평문으로 볼 수 없음
  • Vault 데이터를 암호화하여 저장하기에, Unsealing(개봉) 전에는 거의 모든 작업이 불가능
  • 암호화 키로 데이터를 암호화하고, 암호화 키는 키링에 보관하여 데이터와 함께 저장
  • 키링은 마스터 키로 알려진 다른 암호화 키로 암호화
  • Vault는 데이터를 복호화하기 위하여 먼저 암호화 키를 마스터 키를 이용하여 복호화 → Unsealing(복호화)는 마스터 키에 접근하는 프로세스
  • 마스터 키도 다른 모든 데이터와 함께 저장되지만 또 다른 메커니즘인 봉인해제 키(unseal key)에 의해 암호화

1. 데이터는 키링의 암호화 키로, 암호화 키는 마스터 키로, 마스터 키는 봉인해제 키로 암호화

"봉인해제 키 → 마스터 키 → 암호화 키 → 데이터"

2. Shamir’s Secret Sharing 샤미르의 비밀 공유

  • 봉인해제 키는 샤미르의 비밀 공유 알고리즘을 사용하여 여러 조각으로 분할되어 생성 (RSA에 'S'의 그 Shamir)
  • 각 봉인해제 키는 분리된 공간에 저장할 것을 권장
  • 봉인해제 시에 각 키를 입력 받아 임계치 이상의 키가 입력이 되면 봉인해제
  • Vault에서는 기본 값으로 5개의 키가 생성이 되고, 3개의 키가 입력되면 봉인해제


Unsealing(봉인해제)

  • Unsealing는 아래의 과정 중 하나를 통하여 수행
    1. 터미널에서 vault operator unseal 명령을 입력 후 Unsealing 키를 차례로 입력
    2. Unseal API 호출
    3. WebUI에서 키를 차례로 입력
  • Unsealing 상태에서 다시 sealing 상태가 되는 경우는 아래 중 하나의 방법으로 수행
    1. Seal API 호출
    2. Vault 서버 재시작
    3. Vault 저장소에서 복구할 수 없는 오류가 발생


Sealing(봉인)

  • sealing API를 호출하면 메모리에 있는 마스터 키가 폐기 → sealing 상태가 되면 vault를 사용하기 위해서 Unsealing 과정이 필요
  • sealing에는 루트 권한이 있는 단일 작업자만 필요
  • 침입이 감지되었을 때 Vault 데이터를 빠르게 잠가 피해를 최소화 가능


Vault server 초기화할 때 unseal key 발행

  • key-shares → 발행되는 unseal key 개수
  • key-threshold → 인증할 때 unseal key 사용 개수
  • key-shares와 key-threshold 옵션을 사용 X → 5개의 unseal key 발행되고, 그 중 3개를 입력해야 vault CLI 명령 사용 가능
  • vault 서버 초기화할 때는 vault 서버의 API를 설정 필요
    # VAULT_ADDR이 설정
    VAULT_ADDR='https://[테스트 도메인]:8200'

1. vault 서버 초기화

  • 5개의 unseal key 발행되고, 그 중 3개를 입력해야 VAULT 사용 가능

      # unseal key 발행
      $ vault operator init
      Unseal Key 1: ayPqZuzG7bBN3uRp/GYfUBIVg9MGrbIotnHrjYXNWQIm
      Unseal Key 2: iRntqlhFUfybvnjzLCHHxq/GQfDDtuPupxJyFqpLqpNc
      Unseal Key 3: ibTmbjiieSQPLB2ZnUNY2hrplvrr6ab1m8FnyY8moMMu
      Unseal Key 4: RdU4jDtYmAlF9bDFg8J3/l67Nph72ZFuyXlGWTzsP/ja
      Unseal Key 5: yO+uE3m3eCy/IgzU6qQFz4QC2mIlG6ZcVXC8ZH65u0Rr
    
      Initial Root Token: s.asQ2M2u8kefJAH7pTRK9VZuY
    
      Vault initialized with 5 key shares and a key threshold of 3. Please securely
      distribute the key shares printed above. When the Vault is re-sealed,
      restarted, or stopped, you must supply at least 3 of these keys to unseal it
      before it can start servicing requests.
    
      Vault does not store the generated master key. Without at least 3 keys to
      reconstruct the master key, Vault will remain permanently sealed!
    
      It is possible to generate new unseal keys, provided you have a quorum of
      existing unseal keys shares. See "vault operator rekey" for more information.

2. unseal키 수동 설정하여 vault 서버 초기화 (예시)

  • unseal 키 1개 설정하였으며, 1개의 unseal키를 입력하면 vault 서버 사용 가능

      # unseal key 발행
      $ vault operator init -key-shares=1 -key-threshold=1
    
      Unseal Key 1: 8vTbeSYOS0yWMve+NFy2eisJQkbqaPOb6ocp3zkHS1c=           # Unseal key 1개 발행 확인 -> 보관 필요
    
      Initial Root Token: s.s15mhZCNj4oOwcYji8TuIx5h                                        # Root Token 도 1개 발행 -> 보관 필요
    
      Vault initialized with 1 key shares and a key threshold of 1. Please securely
      distribute the key shares printed above. When the Vault is re-sealed,
      restarted, or stopped, you must supply at least 1 of these keys to unseal it
      before it can start servicing requests.
    
      Vault does not store the generated master key. Without at least 1 keys to
      reconstruct the master key, Vault will remain permanently sealed!
    
      It is possible to generate new unseal keys, provided you have a quorum of
      existing unseal keys shares. See "vault operator rekey" for more information.

3. vault 초기화 후 vault 서버 상태 확인

$ vault status
Key                       Value
---                        -----
Seal Type               shamir
Initialized               true
Sealed                   true
Total Shares           5                  # unseal 발행 개수
Threshold               3                  # unseal 인증 개수
Unseal Progress      0/3
Unseal Nonce         n/a
Version                  1.9.3
Storage Type          file
HA Enabled            false



Root Token인 VAULT_TOKEN을 환경 변수 지정

  • VAULT_TOKEN은 Vault를 초기화(init)할 때 root token이라고 획득 → s.asQ2M2u8kefJAH7pTRK9VZuY
  • Vault 서버의 루트 권한이 있는 토큰
    1. 서버의 모든 작업을 가능
    2. sealed 상태로 변경 가능
    3. unseal 상태로 변경은 불가능
  • vault 토큰은 VAULT_TOKEN 환경변수에 저장하면 vault 클라이언트에서 사용 가능

    # vault token을 환경 변수에 지정
    $ export VAULT_TOKEN=s.asQ2M2u8kefJAH7pTRK9VZuY
    $ echo -e "export VAULT_TOKEN=s.asQ2M2u8kefJAH7pTRK9VZuY" >> /root/.bashrc
    
    # VAULT에서 지정한 환경변수 확인
    $ env | grep -i vault
    VAULT_ADDR=https://[테스트 도메인]:8200
    VAULT_TOKEN=s.asQ2M2u8kefJAH7pTRK9VZuY



Vault Server를 unseal

  • vault init을 할 때 받은 unseal key를 입력 → 초기화할 때 발행받은 5개 중에 3개만 입력하면 됨
    1. 첫번째 : iRntqlhFUfybvnjzLCHHxq/GQfDDtuPupxJyFqpLqpNc
    2. 두번째 : ibTmbjiieSQPLB2ZnUNY2hrplvrr6ab1m8FnyY8moMMu
    3. 세번째 : RdU4jDtYmAlF9bDFg8J3/l67Nph72ZFuyXlGWTzsP/ja
  • 기본적으로 Vault server를 초기화하면 Sealed 상태가 됨 → 즉, 잠겨있어서 Vault 서버에서 정보를 읽는 등 작업 불가능
  • Vault server를 init에 알려준 Unseal Key를 이용하면 Unsealed 상태로 변경 → Vault 서버의 정보 읽기, 쓰기 등 여러 작업 가능

1. vault Server unseal (봉인 해제)

  • 3번의 vault operator unseal을 통해 봉인 해제

  • unseal 명령어를 성공할 때마다 Unseal Progress의 수치가 올라가서 3/3이 되었을 때 unseal이 됨

  • unseal이 완료 → Sealed : false

    # 첫번째 Vault unseal
    $ vault operator unseal
    Unseal Key (will be hidden):
    Key                Value
    ---                -----
    Seal Type          shamir
    Initialized        true
    Sealed             true
    Total Shares       5
    Threshold          3
    Unseal Progress    1/3
    Unseal Nonce       ccbf047b-5956-fdd8-29f9-bad6969cdd45
    Version            1.9.3
    Storage Type       file
    HA Enabled         false
    
    # 두번째 Vault unseal
    $ vault operator unseal
    Unseal Key (will be hidden):
    Key                Value
    ---                -----
    Seal Type          shamir
    Initialized        true
    Sealed             true
    Total Shares       5
    Threshold          3
    Unseal Progress    2/3
    Unseal Nonce       ccbf047b-5956-fdd8-29f9-bad6969cdd45
    Version            1.9.3
    Storage Type       file
    HA Enabled         false
    
    # 세번째 Vault unseal
    $ vault operator unseal
    Unseal Key (will be hidden):
    Key             Value
    ---             -----
    Seal Type       shamir
    Initialized     true
    Sealed          false
    Total Shares    5
    Threshold       3
    Version         1.9.3
    Storage Type    file
    Cluster Name    vault-cluster-0b89b3d2
    Cluster ID      dbea1671-61fa-c4c8-387e-e32390ace762
    HA Enabled      false

※ unseal 참고 사항

  • 연속적으로 unseal을 3번 실행하여 Vault 서버를 열 수 있다.
  • 하지만, 한사람이 unseal key를 다 가지는 것은 위험 → 키를 5명이 나누어 갖고 3명이 unseal을 하면 Vault 서버를 엶
  • Vault에 중요한 정보가 있음으로 서버를 재시작하거나 보안 문제 발생으로 sealed 상태로 바꾸었을 때, 다시 서버를 열려면 unseal 단계를 거쳐야 함
  • unseal 과정은 서버가 기억하고 있으므로 한자리에 모일 필요 없이 각자의 자리에서 unseal을 하기만 하면 됨
  • unseal은 시간 제한도 없기에 충분히 시간을 두고 진행 가능
  • 스토리지 백엔드에도 암호화된 정보가 저장되어 있고, 복호화하려면 unseal 단계가 필수적 → unseal 키 3개가 없으면 Vault 서버도 복호화키도 만들어 낼 수 없음
  • DB가 통째로 털려도 Vault 서버가 통째로 털려도 unseal 키 3개가 없다면 공격자는 정보를 볼 수 없게 되어 안전함

2. unseal할 때 출력한 vault server 상태와 vault status 명령어로 출력되는 상태가 같은 지 확인

  • vault server가 unseal됨 → token을 입력해야 서버 내부 접근 가능

    $ vault status
    Key                 Value
    ---                   -----
    Seal Type         shamir
    Initialized         true
    Sealed             false
    Total Shares      5
    Threshold         3
    Version             1.9.3
    Storage Type     file
    Cluster Name    vault-cluster-0b89b3d2
    Cluster ID         dbea1671-61fa-c4c8-387e-e32390ace762
    HA Enabled       false



Vault Server를 Sealing

  • vault를 서버에 보안 문제가 있거나, 안전하게 관리하기 위해서 unsealing되어있는 것을 sealing으로 변경

      $ vault operator seal
      Success! Vault is sealed.
  • 다시 sealing된 vault 서버의 상태 확인

      $ vault status
      Key                    Value
      ---                   -----
      Seal Type          shamir
      Initialized          true
      Sealed               true
      Total Shares        5
      Threshold           3
      Unseal Progress     0/3
      Unseal Nonce       n/a
      Version               1.9.3
      Storage Type        file
      HA Enabled          false

  • systemd 서비스 사용하여 vault 서버 구축
  • Vault 실 서버에 사용할 도메인 및 인증서 필요
  • VAult 관련 참고 URL : https://www.vaultproject.io/docs

Valut 설치 및 systemd로 서비스 관리

1. Vault 설치 및 패키지 버전 확인

$ yum install -y yum-utils
$ yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
$ yum -y install vault

2. 설치한 vault 패키지 버전 확인

$ vault version
Vault v1.9.3 (7dbdd57243a0d8d9d9e07cd01eb657369f8e1b8a)

3. Vault 서비스를 systemd로 관리

$ vi /etc/systemd/system/vault.service
[Unit]
Description=Vault secret store
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
ExecStart=/usr/bin/vault server -config=/vault/config/vault-config.hcl
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target



Vault 서버 실행

  • vault를 다운받게 되면 기본적으로 /opt/vault/ 디렉토리 아래에 있는 data 디렉토리와 tls 디렉토리 생성
  • data 디렉토리는 Vault 데이터가 저장되는 공간
  • tls 디렉토리는 Vault의 https를 사용하기 위한 인증서 키가 있는 공간 → https를 사용할 인증서 설치 필요
  • /vault/ 디렉토리 data 디렉토리와 tls 디렉토리 복사 필요

1. Vault config 적용 → https://[Vault 서버 도메인]:8200

  • Vault Server는 configuration file을 통해서 configuration을 얻음.

  • vault-config.hcl 이름을 가진 configuration 파일을 통해서 Vault Server에서 사용할 configuration 확인 가능

  • 기본 Vault 서버의 API를 사용하는 주소를 설정 → VAULT_ADDR=’https://[Vault 서버 도메인]:8200’

  • vault-config.hcl을 생성하기 윈한 내용 참고 URL : https://www.vaultproject.io/docs/configuration

    $ mkdir /vault
    $ cp -r /opt/vault/* /vault/
    $ ls /vault/
    data  tls
    
    $ mkdir /vault/config/
    
    # vault-config를 설정할 hcl 생성
    $ vi /vault/config/vault-config.hcl
    # ui 사용 허가
    ui = true
    
    # Vault 데이터가 저장되는 스토리지 백엔드를 구성
    storage "file" {
    path = "/vault/data"
    }
    
    # API 서버의 IP와 PORT 선언
    api_addr = "https://[Vault 서버 도메인]:8200"
    
    # HTTP listener -> HTTP 사용 X
    #listener "tcp" {
    #  address = "0.0.0.0:8200"
    #  tls_disable = 1
    #}
    
    # HTTPS listener -> HTTPS 사용
    listener "tcp" {
    address       = "0.0.0.0:8200"
    tls_cert_file = "/vault/tls/tls.crt"
    tls_key_file  = "/vault/tls/tls.key"
    }
    
    # 기본 VAULT_ADDR은 "https://127.0.0.1:8200"으로 되어있기에 vault 서버의 API를 사용하는 주소를 설정 
    # VAULT_ADDR='https://[Vault 서버 도메인]:8200'
    $ export VAULT_ADDR='https://[Vault 서버 도메인]:8200'
    $ echo -e "export VAULT_ADDR='https://[Vault 서버 도메인]:8200'" >> /root/.bashrc
    $ echo $VAULT_ADDR
    https://[Vault 서버 도메인]:8200

2. vault.service를 재시작하여 설정 적용

$ systemctl daemon-reload
$ systemctl start vault.service
$ systemctl status vault
● vault.service - Vault secret store
   Loaded: loaded (/etc/systemd/system/vault.service; disabled; vendor preset: disabled)
   Active: active (running) since Sun 2022-02-27 16:42:28 KST; 24s ago
 Main PID: 14832 (vault)
   CGroup: /system.slice/vault.service
           └─14832 /usr/bin/vault server -config=/vault/config/vault-config.hcl

3. config 설정을 적용한 vault 서버가 정상적으로 실행되는 지 확인 → API

# jq 패키지 설치
$ yum install -y jq


# 외부에서 https://[Vault 서버 도메인]:8200 도메인 요청하여  vault server에게 API 성공 확인
$ curl https://[Vault 서버 도메인]:8200/v1/sys/seal-status | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   168  100   168    0     0     29      0  0:00:05  0:00:05 --:--:--    40
{
  "type": "shamir",
  "initialized": false,
  "sealed": true,
  "t": 0,
  "n": 0,
  "progress": 0,
  "nonce": "",
  "version": "1.9.3",
  "migration": false,
  "recovery_seal": false,
  "storage_type": "file"
}

4. config 설정을 적용한 vault 서버에 status 확인

# vault 서버에서 vault status 명령어 확인
$ vault status
Key                     Value
---                      -----
Seal Type            shamir
Initialized            false
Sealed                 true
Total Shares         0
Threshold             0
Unseal Progress    0/0
Unseal Nonce        n/a
Version                1.9.3
Storage Type        file
HA Enabled          false



Vault UI 웹페이지 Open

  1. https://[Vault 서버 도메인]:8200으로 접속
  2. 아직 Unseal을 하지 않았기 때문에 접근은 불가능 → unseal을 하면 웹 페이지 안에 접근 가능

  • 토큰, 비밀번호, 인증서, 암호화 키와 같은 비밀 정보나 민감한 데이터를 UI, CLI, HTTP API 를 활용할때 안전하게 저장하고 제어할수 있게 해주는 오픈 소스
  • vault 메뉴얼 URL : https://www.vaultproject.io/

Valut 설치

$ yum install -y yum-utils
$ yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
$ yum -y install vault

# 설치한 vault 패키지 버전 확인
$ vault -v
Vault v1.8.0 (82a99f14eb6133f99a975e653d4dac21c17505c7)



Vault server를 DEV 모드로 실행

1. 환경변수 등록

  • vault CLI 를 사용하기 위해 환경변수 등록이 필요

      # 수동으로 환경 변수 등록
      $ export VAULT_ADDR='http://127.0.0.1:8200'
    
      # 영구적으로 환경 변수 등록
      $ echo "export VAULT_ADDR='http://127.0.0.1:8200'" >> /root/.bashrc
      $ source /root/.bashrc
    
      # 설정 확인
      $ echo $VAULT_ADDR
      http://127.0.0.1:8200

2. 테스트를 위해 -dev 모드로 백그라운드에서 서버를 실행

  • dev모드는 미리 준비된 설정으로 서버를 구동

  • dev 모드는 모든 데이터는 in-memory 저장, 암호화

  • localhost로 listen되며 TLS가 없음

  • 자동 봉인 해제 → 봉인 해제된 키와 엑세스 토큰을 보여줌

  • 프로덕션 모드에서는 -dev 옵션 사용을 권장 X

    $ vault server -dev &
    ==> Vault server configuration:
    
               Api Address: http://127.0.0.1:8200
                       Cgo: disabled
           Cluster Address: https://127.0.0.1:8201
                Go Version: go1.16.5
                Listener 1: tcp (addr: "127.0.0.1:8200", cluster address: "127.0.0.1:8201", max_request_duration: "1m30s", max_request_size: "33554432", tls: "disabled")
                 Log Level: info
                     Mlock: supported: true, enabled: false
             Recovery Mode: false
                   Storage: inmem
                   Version: Vault v1.8.0
               Version Sha: 82a99f14eb6133f99a975e653d4dac21c17505c7
    
    ==> Vault server started! Log data will stream in below:
    
    2021-08-02T14:07:10.555Z [INFO]  proxy environment: http_proxy="" https_proxy="" no_proxy=""
    2021-08-02T14:07:10.556Z [WARN]  no `api_addr` value specified in config or in VAULT_API_ADDR; falling back to detection if possible, but this value should be manually set
    2021-08-02T14:07:10.557Z [INFO]  core: security barrier not initialized
    2021-08-02T14:07:10.557Z [INFO]  core: security barrier initialized: stored=1 shares=1 threshold=1
    2021-08-02T14:07:10.558Z [INFO]  core: post-unseal setup starting
    2021-08-02T14:07:10.572Z [INFO]  core: loaded wrapping token key
    2021-08-02T14:07:10.572Z [INFO]  core: successfully setup plugin catalog: plugin-directory=""
    2021-08-02T14:07:10.572Z [INFO]  core: no mounts; adding default mount table
    2021-08-02T14:07:10.573Z [INFO]  core: successfully mounted backend: type=cubbyhole path=cubbyhole/
    2021-08-02T14:07:10.574Z [INFO]  core: successfully mounted backend: type=system path=sys/
    2021-08-02T14:07:10.574Z [INFO]  core: successfully mounted backend: type=identity path=identity/
    2021-08-02T14:07:10.582Z [INFO]  core: successfully enabled credential backend: type=token path=token/
    2021-08-02T14:07:10.589Z [INFO]  core: restoring leases
    2021-08-02T14:07:10.603Z [INFO]  rollback: starting rollback manager
    2021-08-02T14:07:10.603Z [INFO]  expiration: lease restore complete
    2021-08-02T14:07:10.604Z [INFO]  identity: entities restored
    2021-08-02T14:07:10.604Z [INFO]  identity: groups restored
    2021-08-02T14:07:10.604Z [INFO]  core: post-unseal setup complete
    2021-08-02T14:07:10.604Z [INFO]  core: root token generated
    2021-08-02T14:07:10.604Z [INFO]  core: pre-seal teardown starting
    2021-08-02T14:07:10.604Z [INFO]  rollback: stopping rollback manager
    2021-08-02T14:07:10.604Z [INFO]  core: pre-seal teardown complete
    2021-08-02T14:07:10.604Z [INFO]  core.cluster-listener.tcp: starting listener: listener_address=127.0.0.1:8201
    2021-08-02T14:07:10.604Z [INFO]  core.cluster-listener: serving cluster requests: cluster_listen_address=127.0.0.1:8201
    2021-08-02T14:07:10.604Z [INFO]  core: post-unseal setup starting
    2021-08-02T14:07:10.605Z [INFO]  core: loaded wrapping token key
    2021-08-02T14:07:10.605Z [INFO]  core: successfully setup plugin catalog: plugin-directory=""
    2021-08-02T14:07:10.605Z [INFO]  core: successfully mounted backend: type=system path=sys/
    2021-08-02T14:07:10.605Z [INFO]  core: successfully mounted backend: type=identity path=identity/
    2021-08-02T14:07:10.605Z [INFO]  core: successfully mounted backend: type=cubbyhole path=cubbyhole/
    2021-08-02T14:07:10.606Z [INFO]  core: successfully enabled credential backend: type=token path=token/
    2021-08-02T14:07:10.606Z [INFO]  core: restoring leases
    2021-08-02T14:07:10.607Z [INFO]  identity: entities restored
    2021-08-02T14:07:10.607Z [INFO]  identity: groups restored
    2021-08-02T14:07:10.607Z [INFO]  core: post-unseal setup complete
    2021-08-02T14:07:10.607Z [INFO]  core: vault is unsealed
    2021-08-02T14:07:10.609Z [INFO]  core: successful mount: namespace="" path=secret/ type=kv
    2021-08-02T14:07:10.610Z [INFO]  expiration: lease restore complete
    2021-08-02T14:07:10.610Z [INFO]  secrets.kv.kv_f71fab5a: collecting keys to upgrade
    2021-08-02T14:07:10.610Z [INFO]  secrets.kv.kv_f71fab5a: done collecting keys: num_keys=1
    2021-08-02T14:07:10.610Z [INFO]  secrets.kv.kv_f71fab5a: upgrading keys finished
    2021-08-02T14:07:10.611Z [INFO]  rollback: starting rollback manager
    WARNING! dev mode is enabled! In this mode, Vault runs entirely in-memory
    and starts unsealed with a single unseal key. The root token is already
    authenticated to the CLI, so you can immediately begin using Vault.
    
    You may need to set the following environment variable:
    
      $ export VAULT_ADDR='http://127.0.0.1:8200'
    
    The unseal key and root token are displayed below in case you want to
    seal/unseal the Vault or re-authenticate.
    
    Unseal Key: +1P8t1jNPI8mBPCV57v+emB4E3DttH3t1xkz+oXsQUs=
    Root Token: s.BT8kE324DT9EJYQqG8noC8J1
    
    Development mode should NOT be used in production installations!

3. 실행된 서버의 상태를 확인

$ vault status
Key                   Value
---                    -----
Seal Type          shamir
Initialized          true
Sealed              false
Total Shares      1
Threshold          1
Version             1.3.0
Cluster Name    vault-cluster-a6999d5c
Cluster ID         291371dc-e6a5-42d3-fca7-b2373ff70194
HA Enabled       false



vault 와 secret

  • vault의 핵심 기능중 하나는 비밀정보를 안전하게 읽고 쓰는것
  • vault에 기록된 비밀정보는 암호화하여 backend 저장소에 저장
  • 값을 저장소에 전달하기 전에 암호화를 하며, backend 저장소에 저장된 암호화값은 vault 없이는 해독 불가능



write a secret (비밀정보 작성)

  • key 값의 접두사가 secret/ 로 저장됨

  • secret/ 는 어떤 secrets engine을 실행시킬지 결정하는 route 역할(경로 결정)

  • 비밀정보를 기록할때는 shell history에 남기때문에 되도록이면 file 을 통해서 전달될수있도록 하는것이 좋음

  • kv → Vault의 키-값 저장소와 상호작용 (command)

  • put → KV 저장소의 데이터를 설정하거나 업데이트함

  • secret/hello → hello 이름을 가지는 secret engine 사용

  • foo=world → foo 키에 world 값이 있음

    $ vault kv put secret/hello foo=world
    Key                     Value
    ---                       -----
    created_time        2021-08-02T15:40:03.164784248Z
    deletion_time        n/a
    destroyed             false
    version                1



read a secret (비밀정보 읽기)

1. secret과 함께 여러 가지 메타 데이터가 함께 반환

  • 비밀정보를 획득

  • vault는 저장소로부터 값을 가져올때 복호화하여 가져옴

  • kv → Vault의 키-값 저장소와 상호작용 (command)

  • get → KV 저장소에서 데이터 검색

  • secret/hello → hello 이름을 가지는 secret engine 사용

    $ vault kv get secret/hello
    ====== Metadata ======
    Key Value
    --- -----
    created_time 2019-11-26T02:39:20.8458832Z
    deletion_time n/a
    destroyed false
    version 1
    
    === Data ===
    Key Value
    --- -----
    foo world

2. hello 키에 해당하는 값 추출

  • kv → Vault의 키-값 저장소와 상호작용 (command)

  • get → KV 저장소에서 데이터 검색

  • field=key → 입력한 key의 value를 출력, -field 옵션을 사용하면 다른 형식 지정 지시문보다 우선

    $ vault kv get -field=foo secret/hello
    world

3. JSON output → 결과데이터의 포맷을 json형식으로 출력

  • kv → Vault의 키-값 저장소와 상호작용 (command)

  • get → KV 저장소에서 데이터 검색

  • format=형식 → "table", "json", "yaml", "pretty" 중에 입력한 형식으로 출력 → 기본값은 table로 출력

  • format 옵션을 사용하지 않고, VAULT_FORMAT 환경 변수를 통해 지정 가능

    $ vault kv get -format=json secret/hello
    {
    "request_id": "777069c4-4cb8-1bfa-2eaa-5d35018eca54",
    "lease_id": "",
    "lease_duration": 0,
    "renewable": false,
    "data": {
      "data": {
        "foo": "world"
      },
      "metadata": {
        "created_time": "2021-08-02T15:40:03.164784248Z",
        "deletion_time": "",
        "destroyed": false,
        "version": 1
      }
    },
    "warnings": null
    }

4. jq 활용 → jq 도구를 통해 더 편리하게 원하는 메타정보를 가져올 수 있음

  • kv → Vault의 키-값 저장소와 상호작용 (command)

  • get → KV 저장소에서 데이터 검색

  • format=json → json 형식으로 출력

  • json 형식으로 출력되면 key값으로 해서 해당 value를 찾을 수 있음

    # jq를 사용하기 위해서는 패키지 설치 필요
    $ yum install -y jq
    
    #  data 키 → data 키 → foo 키의 값 출력
    $ vault kv get -format=json secret/hello | jq -r .data.data.foo
    world



delete a secret (비밀정보 삭제)

  • 저장된 비밀정보를 삭제

  • kv → Vault의 키-값 저장소와 상호작용 (command)

  • delete → KV 저장소에서 데이터 삭제

    $ vault kv delete secret/hello
    Success! Data deleted (if it existed) at: secret/hello
    
    # key와 value가 삭제됨을 확인
    $ vault kv get secret/hello
    ====== Metadata ======
    Key                      Value
    ---                       -----
    created_time        2021-08-02T15:40:03.164784248Z
    deletion_time       2021-08-02T16:17:00.129797593Z
    destroyed             false
    version                1

  • 하시코프 볼트(Harshicorp Vault)는 아이덴티티 기반의 비밀, 암호화 관리 시스템
  • 공개되면 안되는 비밀번호, API 키, 토큰 등을 저장하고 관리함
  • 제한된 접근을 제공하기 위해 인증(authentication) 및 권한 부여(authorization) 방법으로 제어되는 암호화 서비스를 제공
  • UI, CLI 또는 HTTP API를 사용하여 토큰, 암호, 인증서, 비밀 보호를 위한 암호화 키 및 민감 정보에 대한 접근을 보호, 저장 및 엄격하게 제어하는 데 사용
  • vault 공식 참고 URL : https://www.vaultproject.io/docs
  • Vault HA 구성 with Consul : https://shanta.tistory.com/16?category=982069

Vault 기능

  1. 사용의 핵심 → 인증 및 권한 부여
  2. 인증 및 권한을 클라이언트에 제공하는 방법을 이해하는 것이 구성하고 관리하는 방법을 이해하기 위한 핵심
  3. 인증 방법(auth method)을 사용 → 클라이언트에 인증을 제공
  4. 정책(policy)을 사용 → 클라이언트에 권한 제어를 제공

Vault는 몇 가지 내부 또는 외부 인증 방법을 제공

  1. 외부 방법을 AWS, LDAP, GitHub 등과 같은 신뢰할 수 있는 서드파티 인증자(trusted third-party authenticators)
  2. 어떤 상황에서 신뢰할 수 있는 서드파티 인증자를 사용할 수 없으므로 Vault에서는 AppRole이라는 대체 수단을 마련
  3. 신뢰할 수 있는 서드파티 인증자가 있다면 그것을 사용하는 것이 AppRole을 사용하는 것보다는 바람직

Vault 아키텍처

1. Storage Backend

  • 스토리지 백엔드(Storage Backend)는 암호화된 데이터를 저장하기 위한 스토리지를 담당
  • Vault는 스토리지의 종류, 가용성 등을 책임지지 않음 → 어떤 스토리지 백엔드를 쓸 것인지는 고객이 결정
  • Vault는 15가지 이상 스토리지를 지원
  • filesystem과 in-memory 스토리지는 백앤드는 개발단계에서 빠르게 활용하기에 좋은 시스템
  • 나머지 스토리지 백앤드는 서비스 전개 환경에 따라서 선택적으로 구성
  • 스토리지 백엔드(Storage Backend) 종류
    1. HashCorp Consul
    2. Etcd
    3. Zookeeper
    4. AWS S3
    5. AWS DynamoDB
    6. Azure Storage Container
    7. Triton Manta Object Storage
    8. GCP Cloud Storage
    9. GCP Cloud Spanner
    10. MySQL
    11. PostgreSQL
    12. MSSQL
    13. Swift
    14. Raft
    15. Filesystem
    16. CockroachDB
    17. Cassandra

2. Barrier

  • Barrier는 장벽이라는 의미 → 데이터의 안전한 사용을 위한 강철벽
  • 스토리지 백앤드(Storage Backend) 간에 흐르는 모든 데이터는 Barrier를 통과함
  • Barrier는 암호화된 데이터만을 기록하며, 데이터가 필요한 시점에 복호화(암호해독)이 되도록함
  • barrier를 통과해야만 내부 데이터에 접근 가능.

3. Secret Engine

  • Secrets Engine은 데이터를 저장, 생성, 암호화하는 구성요소
  • Secret Engine 중 Redis/Memcached에 단순하게 key&value 형식으로 데이터를 저장하고 읽을 수 있음
  • 다른 Secrets Engine은 서비스에 연결하고 요청을 하는 시점에서 동적으로 자격증명을 생성 가능
  • AWS를 대상으로 할 경우, 시크릿 엔진은 AWS IAM 정책을 기반으로 AWS 자격증명을 동적으로 생성 가능 → AWS IAM 자격 증명은 시간을 기반으로 하기 때문에, 일정 시간이 지나면 자동으로 자격증명을 삭제함
  • SSH를 이용해서 인스턴스에 대한 접근권한을 관리할 경우에는 SSH Secret Engine을 사용할 수 있음 → SSH 유저, 권한, 유효시간, 원타임 패스워드등을 안전하게 관리
  • 다양한 서비스를 위한 Secret Engine 목록
    1. Active Directory
    2. AliCloud
    3. AWS
    4. Azure
    5. Consul
    6. Cubbyhole
    7. Database
    8. Google Cloud
    9. Google Cloud KMS
    10. KMIP
    11. Key/Value
    12. Identity
    13. Nomad
    14. PKI
    15. RabbitMQ
    16. SSH
    17. TOTP
    18. Transit

4. Audit Device

  • Audit device는 감사 로그를 관리
  • Valut에 대한 모든 요청과 응답은 Audit device를 통과하면서 로그를 기록
  • 관리자는 로그를 통해서 시스템 상태를 관리 가능

5. Auth Method

  • Auth Method는 Vault에 연결하려는 유저와 애플리케이션을 인증하기 위해서 사용
  • 인증되면 Auth Method는 인증된 사용자와 사용 할 수 있는 애플리케이션 정책 목록을 리턴
  • 클라이언트 토큰(client token)을 리턴하는데, 한번 인증을 끝내고 나면 클라이언트 토큰을 이용하게 됨
  • 다른 구성요소들과 마찬가지로 다양한 서비스를 Auth Method로 사용 가능
  • 예를 들어서 Userpass(Username & Password) auth method는 유저이름과 패스워드 기반의 인증 매커니즘을 제공
  • Auth Method의 목록
    1. AppRole
    2. AliCloud
    3. AWS
    4. Azure
    5. Google Cloud
    6. JWT/OIDC
    7. Kubernetes
    8. GitHub
    9. LDAP
    10. Okta
    11. PCF
    12. RADIUS
    13. TLS Certificates
    14. Tokens
    15. Username & Password

6. Client Token

  • Client Token 혹은 Vault Token은 웹 사이트에서 사용하는 세션 쿠기(session cookie)과 개념적으로 비슷함
  • 사용자 인증이 끝나면 Vault는 클라이언트 토큰을 리턴하는데, 이후에는 클라이언트 토큰을 이용해서 작업을 수행 가능
  • Vault는 Client Token을 이용해서 클라이언트를 식별하고 애플리케이션 접근 정책을 검사함
  • Client Token 은 HTTP 헤더를 통해서 전달됨

7. Secret

  • Secret는 암호화된 데이터를 포함해서 Vault가 리턴하는 모든 정보를 의미
  • Vault가 반환하는 모든 정보가 Secret 인 것은 아님 → 시스템 설정, 상태 정보, 정책등은 secret로 간주되지 않음
  • Secret는 lease(임대)객체 → Lease가 끝나면 Vault는 Secret를 파기함
  • 관리자는 lease 정보를 확인해서 Secret를 철회하거나 연장하기 위해서 개입 가능
  • 예를 들어 관리자는 아래와 같은 Secret를 생성 가능
    $ vault kv put secret/hello foo=world
    Key                     Value
    ---                       -----
    created_time        2019-08-19T03:53:56.491587848Z
    deletion_time       n/a
    destroyed             false
    version                1

8. Server

  • Vault는 클라이언트/서버 애플리케이션
  • Vault 서버는 데이터 스토리지와 백앤드 등과 상호작용함
  • Vault 서버는 전체 Vault 아키텍처에서 하나의 컴포넌트로 작동함
  • 사용자는 Vault CLI를 이용해서 TLS 연결로 서버와 통신 가능



암호화 알고리즘 → Vault 서버에서는 암호화 알고리즘을 사용

  • 암호화 알고리즘은 일반적으로 공개됨 → 암호화 열쇠를 어떻게 만들고 저장하고 관리할 것인지가 가장 중요
  • 한국인터넷진흥원(KISA)에서는 암호화된 데이터와 암호화 키는 물리적으로 안전하게 분리된 장소에 보관해야 한다고 권고
  • 데이터는 암호화하여 DB에 보관한다고 하면 키는 볼트(Vault)에 저장하는 것이 좋음
  • 볼트(Vault) 서비스는 일반적으로 암호화 키, 인증서 등 민감한 데이터를 안전하게 보호함
  • 볼트(Vault) 서비스는 민감 데이터를 DB에 전달하기 전에 암호화를 하며, DB에 저장된 암호화된 민감 데이터는 Vault 없이는 해독할 수 없음 → 민감 데이터를 안전하게 보호 가능


+ Recent posts