Ansible/우아한앤서블

[Ansible] known_hosts 등록, 전자서명을 위한 authorized_keys 등록

Jen'_' 2021. 4. 30. 19:07
반응형

 

known_hosts

'ansible all -m ping'을 입력하면 노드 수만큼 'yes'를 입력해야한다

하지만 여러개를 동시에 했더니 개수만큼 yes도 못함 이러면 접속을 할 수가 없다 

 

[vagrant@ansible-server ~]$ ansible all -m ping

The authenticity of host '192.168.219.101 (192.168.219.101)' can't be established.
ECDSA key fingerprint is SHA256:1GF9uYRwsy11hRN1ZkiEaC23OUw37aheZTgHuFs2LHk.
ECDSA key fingerprint is MD5:ce:34:5b:d0:e9:e1:fd:f1:cf:ef:f5:57:1a:46:78:b7.
Are you sure you want to continue connecting (yes/no)? The authenticity of host '192.168.219.102 (192.168.219.102)' can't be established.
ECDSA key fingerprint is SHA256:1g6lHtPffvU3YOpvllYc91g85uasmZrudOflBtR6VHs.
ECDSA key fingerprint is MD5:f6:e1:71:8b:1a:8e:9d:96:4c:b2:98:fc:b0:ba:34:d5.
Are you sure you want to continue connecting (yes/no)? The authenticity of host '192.168.219.103 (192.168.219.103)' can't be established.
ECDSA key fingerprint is SHA256:j7KqvANePU9D1rs3RHXa9zZS7juoeoTZSgFZQC0pNKc.
ECDSA key fingerprint is MD5:12:7a:eb:dd:77:80:69:32:46:9d:1a:59:bf:7f:46:dc.
Are you sure you want to continue connecting (yes/no)? yes
192.168.219.101 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

 

'yes'를 입력하면 'known_hosts'에 key가 저장된다 

그러면 다음부터 node에 명령어를 보내거나 ssh접속을 하려고 할때 'yes'를 물어보지 않는다 

일일이 yes를 입력하는건 귀찮은 일이므로 자동으로 'known_hosts'에 저장되도록 ansible-playbook을 만들자

 

 

[vagrant@ansible-server ~]$ vi auto_pass.yml

ex) ssh-keyscan 192.168.1.101 >> ~/.ssh/known_hosts 형식

---
- name: Create authority between server and nodes
  hosts: nodes # /etc/ansible/hosts에 nodes에 대한 정보를 읽어들여서 nodes에서 실행하는 것이 아니라
  connection: local # 목적지를 local(ansible-server)로 잡아서 실행 
  serial: 1  # 실행되는 태스크를 한 개씩 진행하라는 의미, 성능이 좋은 시스템의 경우 빠른 진행으로 겹치는 경우가 발생하므로 설정한 옵션
  gather_facts: no

  tasks:
    - name: ssh-keyscan for known_hosts file
      command: /usr/bin/ssh-keyscan -t ecdsa {{ ansible_host }} # "{{ ansible_host }}"라는 변수에 nodes를 불러와
      register: keyscan # command에서 확인된 noeds의 키값을 "keyscan"이라는 변수에 저장

    - name: input key
      lineinfile:      
        path: ~/.ssh/known_hosts
        line: "{{ item }}" # keyscan 변수의 값이 stdout_lines으로 출력되면 known_hosts파일에 한줄씩 저장
        create: yes     
      with_items:
        - "{{ keyscan.stdout_lines }}" 

 

 

매직변수

ansible에서는 특별히 선언하지 않아도, 기본덕으로 사용할 수 있는 변수들이 존재하는데, 이를 매직변수라고 한다.

"ansible_host" 매직변수를 호출하여 /etc/ansible/hosts 에 있는 노드들의 값 중에 플레이북에서 호출한 노드들에 대한 정보를 자동으로 변수로 입력 받은 것이다.

 

 

playbook 적용

[vagrant@ansible-server ~]$ ansible-playbook auto_pass.yml -k

 

known_hosts에 등록된 nodes들의 key 확인

[vagrant@ansible-server ~]$ cat .ssh/known_hosts
192.168.219.101 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBE+LUbm+3D1NiBrMjmsviNyOrwRvsx5MOGj20U80yfoAB35D42bAagfTWpvb4ro6dI2ddehQrkkc8I4U5H/scPs=
192.168.219.102 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBOvdaW6fy13ruPeP370ycvR2VKBXZi2j+IgArJbsjmkphfwWkvmlsltGrndRq86pRL4LcgZmVhfKEy1UzXUo7tk=
192.168.219.103 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBKacMAQ3zE4fo8HRRjqZfAf4vn3d9jeZVNjqP5UZQfeuzN3gx0rIy6vRzg86qrv7DOhkTP2OlAC0lcKhWdtHGgI=
192.168.219.201 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBHg/YQWZJhpf3vMStp9dndYmReANtKXXsBoJJQRs+2lm1jsRM9zaRV9H9NAB+VPM4htqVBYt4sF59Ibl9S8AbCE=
192.168.219.202 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBJh6Yy/SaYqIgjpQauK6Pexnsm+YYDtS4iisOVNQvb4xsJgo63D8hfWwwKtK0QbWcBqWYa89qm1n6xS7hOwF/Ds=
192.168.219.203 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNRfmGZxRgRM/mbo/WUA8ppsryHrRX22fkFanlftk7RuyZn2dxLI8Lhfado0jCirC8tAohVzdzamnKdTR3J+u8Y=

 

 

node에게 ssh접속

-> 사용자에게 접속확인에게 더이상 묻지 않는다!

[vagrant@ansible-server ~]$ ssh 192.168.219.101
Last login: Fri Apr 30 05:26:57 2021 from 192.168.219.10


 

authorized_keys

ansible명령어와 ansible-playbook명령어를 사용할때 ssh 암호를 입력하기 위해 '-k'옵션을 사용해야했다

vagrant ssh ansible-server에서 암호를 입력하지 않았던 이유는 앤서블 서버에 있는 authorized_keys를 이용했기 때문이다 베이그런트 설치시에 authorized_keys 공개키가 자체적으로 등록되어 있기 때문이다.

 

[vagrant@ansible-server ~]$ cat .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCtxvSeVmOJB/1VrBcC7YSeOsXTF21V3K6h9Bb6r7xWc9uwmgsxZI6OM+otmHwn3yexIQ9fpqQww8M5rbhWhjZLSGHzvdi3v+Cl79sq1pariOea22l89Bg70M+qqxvotP3IZA25yfcbrTQfi4sxbevJqjUWrHd+oi7+bAj3k3LAQMoqELzZaH7imBSgV33ZshZSC1nzY8efYxmIhKM8yedKiBylRn0YNs451Syl/eU/9VHOXUewJRMq85N53JRlzuQn/e1fUmJX+0UUGje8KYlv9B58ee16HbqROozgfbu6Jk7qjHwqDC416AiU1n83lotqaP6q8mA3qwKhqHYjWP3f vagrant

 

[vagrant@ansible-node101 ~]$ cat .ssh/authorized_keys 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDI8gfHWkBWGXgGeF+dwuDf4tohN4LGKbcuyc8/sgGUA4ZOMnHyFZZH9LlQjWCRv1LX4PHrjkVNHNy4Nd0edMUh8BpzOTGDRhe94Xlsj9Zmu1cK/TCq0Yz4NgnIGZsVyDB9j5tpPqhyI5+fV3krKh0IabnKN3BQTsFsyEV6ocDZY8Q8S8kb5a4GIlYEozS4cnPWpYEz82O9JRMMNTLGqNoRQhEK9G4aJRmlxP8BEkPkW+peUnzo8OinJjjvETBcw5Hu3HhD0KfKDrp6T7ay6dL/nmh7pfb+9cXlGsMmFjNTw09WwyLjQjczPwr0hlL6BM8G/sBlvS6Z4q7KfrKPY5MD vagrant

 

 

  인증 과정

  1. node에 접속을 시도
  2. node의 ~/.ssh/authorized_keys 파일의 존재를 확인하고, authorized_keys 안에 접속자의 공개 키 정보가 존재하는지 확인
  3. 본인의 개인 키로 authorized_keys에 있는 공개 키를 풀어서 접속 

 

 

-k 옵션을 빼면 에러가 뜬다 

[vagrant@ansible-server ~]$ ansible all -m shell -a "df -h" 
192.168.219.101 | UNREACHABLE! => {
    "changed": false
    "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", 
    "unreachable": true
}
192.168.219.102 | UNREACHABLE! => {
    "changed": false
    "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", 
    "unreachable": true
}
192.168.219.103 | UNREACHABLE! => {
    "changed": false
    "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", 
    "unreachable": true
}


[vagrant@ansible-server ~]$ ansible all -m shell -a "df -h" -k
SSH password: 
192.168.219.103 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        237M     0  237M   0% /dev
tmpfs           244M     0  244M   0% /dev/shm
tmpfs           244M  4.5M  240M   2% /run
tmpfs           244M     0  244M   0% /sys/fs/cgroup
/dev/sda1        40G  4.2G   36G  11% /
tmpfs            49M     0   49M   0% /run/user/1000
192.168.219.101 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        237M     0  237M   0% /dev
tmpfs           244M     0  244M   0% /dev/shm
tmpfs           244M  4.6M  239M   2% /run
tmpfs           244M     0  244M   0% /sys/fs/cgroup
/dev/sda1        40G  4.2G   36G  11% /
tmpfs            49M     0   49M   0% /run/user/1000
192.168.219.102 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        237M     0  237M   0% /dev
tmpfs           244M     0  244M   0% /dev/shm
tmpfs           244M  4.5M  240M   2% /run
tmpfs           244M     0  244M   0% /sys/fs/cgroup
/dev/sda1        40G  4.2G   36G  11% /
tmpfs            49M     0   49M   0% /run/user/1000

 

 

[vagrant@ansible-server ~]$ vi auto_pass.yml

생성했던 파일에 aythorized_keys를 자동으로 등록하는 코드 추가 

---
- name: Create authority between server and nodes
  hosts: nodes
  connection: local
  serial: 1
  gather_facts: no
  vars:
    ansible_password: vagrant # 접속암호를 미리 변수로 선언

  tasks:
    - name: ssh-keyscan for known_hosts file
      command: /usr/bin/ssh-keyscan -t ecdsa {{ ansible_host }}
      register: keyscan

    - name: input key
      lineinfile:      
        path: ~/.ssh/known_hosts
        line: "{{ item }}"
        create: yes     
      with_items:
        - "{{ keyscan.stdout_lines }}"

 

    - name: ssh-keygen for authorized_keys file
      command: "ssh-keygen -b 2048 -t rsa -f ~/.ssh/id_rsa -q -N ''"
      ignore_errors: yes
      run_once: true # 키를 한번만 만들기 위함 

 

    - name: input key for each node
      connection: ssh  # connection: local에서 기본 값인 connection: ssh로 변경 
      authorized_key:  # 각 노드들의 공개키 값을 authorized_keys로 저장하기 위한 모듈
        user: vagrant  # 저장되는 위치는 베이그런트 유저의 ssh설정이 위치한 ~/.ssh/authorized_keys 로저장
        state: present

        key: "{{ lookup('file', '~/.ssh/id_rsa.pub') }}" # 공개키 지정하는 key 옵션, 공개키를 읽는 lookup 옵션, 읽으려는 대상이 파일임을 명시하기 위한 file 옵션, 마지막으로 공개키의 위치를 지정하여 lookup옵션이 파일을 찾고 읽을 수 있도록함

 

 

'ssh-keygen'명령을 통해서 공개 키와 개인 키를 생성할 수 있다.

 

  옵션

  • -b 2048: 생성할 키의 비트수 
  • -t rsa: rsa암호화 방식을 사용하겠다
  • -f <위치>: 키를 생성할 위치 지정
  • -q: 사일런트 모드
  • -N: 암호문을 공란('')으로 생성

 

 

암호를 변수로 지정했기 때문에 처음에 -k 옵션 빼도됨

[vagrant@ansible-server ~]$ ansible-playbook auto_pass.yml 

[vagrant@ansible-server ~]$ ansible all -m ping 
192.168.219.103 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
192.168.219.102 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
192.168.219.101 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}

 

성공!


 

 

 

[vagrant@ansible-server ~]$ ls .ssh/
authorized_keys  id_rsa  id_rsa.pub  known_hosts 

id_rsa 개인키와 id_rsa.pub 공개키가 만들어졌다 

 

[vagrant@ansible-node101 ~]$ cat .ssh/authorized_keys 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDI8gfHWkBWGXgGeF+dwuDf4tohN4LGKbcuyc8/sgGUA4ZOMnHyFZZH9LlQjWCRv1LX4PHrjkVNHNy4Nd0edMUh8BpzOTGDRhe94Xlsj9Zmu1cK/TCq0Yz4NgnIGZsVyDB9j5tpPqhyI5+fV3krKh0IabnKN3BQTsFsyEV6ocDZY8Q8S8kb5a4GIlYEozS4cnPWpYEz82O9JRMMNTLGqNoRQhEK9G4aJRmlxP8BEkPkW+peUnzo8OinJjjvETBcw5Hu3HhD0KfKDrp6T7ay6dL/nmh7pfb+9cXlGsMmFjNTw09WwyLjQjczPwr0hlL6BM8G/sBlvS6Z4q7KfrKPY5MD vagrant
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCy4xzgQiW42yEIVE9i0iFXIbm/+3WYPLFNnrS6CZZcs/YSwqooJrgR2Geo0BBqABMaJCAVdvGSDFfKyjErcAnKBXSVNDOVj7EpN2LxVvT/Qb1n/FKgybMA7BFdtBluiHorHxWo6HFZ7r9Ymo7XUMEQdvff4fwRYNC2/21g0eQ/fsEb5QgjUI1uctdAFUOZ7kTTQfus8Lt71UvSFPlhUDMTgzNhD7ULzolX4qDG9vzF1LUGxJ6xym3GLyysR1rnRB49WvicFtqyCegJrXgfJV3wDPn5iQeC3Ym1Ix4H8YsNvVUCR+WTQOaZl3lRDhUVYCQCKyhizl5/4oRPgVvEagdl vagrant@ansible-server

 

vagrant@ansible-server의 공개키가 생겼다~


 

~/.ssh/ 하위에 기본적으로 있는 파일 4개

authorized_keys server에서 관리하는 파일. server가 알고 있는 client의 public key를 기록한 파일이다. client를 인증할 때 사용한다.
known_host client에서 관리하는 파일. 해당 컴퓨터가 알고 있는 server의 host key를 기록한 파일
id_rsa default 파일이름으로, private key가 저장되어 있다
id_rsa.pub default 파일이름으로, public key가 저장되어 있다

 

 

 

반응형