シナリオ
「シナリオ:CentOS7.6.1810 を minimal インストールしたサーバーの初期設定」の続きです。今回は ssh 接続の設定です。前回は root アカウントで対象ホストにログインしました。今回は「シナリオ:CentOS7.6.1810 を minimal インストールしたサーバーの初期設定」で作成したアカウント workman でログインします。- 鍵認証の設定
- root アカウントによるログインの禁止
- パスワード認証の禁止
- sshd サービスの再起動
対象ホストの状態確認
ping モジュールを実行し、対象ホストが Ansible で管理可能なことを確認します。■ hosts.yml
all: hosts: node-c0706:■ host_vars/node-c0706.yml
ansible_host: 192.168.101.21 ansible_user: workman ansible_password: workman@node_c0706■ 実行結果
[ansibleman@ansiblesv ansible]$ ansible all -i hosts.yml -m ping
node-c0706 | SUCCESS => {
"changed": false,
"ping": "pong"
}
[ansibleman@ansiblesv ansible]$
鍵の作成
鍵認証で作成する鍵を作成します。[ansibleman@ansiblesv ansible]$ ssh-keygen -t ecdsa -b 521
Generating public/private ecdsa key pair.
Enter file in which to save the key (/home/ansibleman/.ssh/id_ecdsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/ansibleman/.ssh/id_ecdsa.
Your public key has been saved in /home/ansibleman/.ssh/id_ecdsa.pub.
The key fingerprint is:
SHA256:Oi0hTcntLzdt0poQTa61wtkJ0XCcmUxKlTKC+DlH6kk ansibleman@ansiblesv.exam.local
The key's randomart image is:
+---[ECDSA 521]---+
| . . o=+= |
| . ..o+o=B |
| . ++.+oo |
| Eo.. = |
| o.+o S + |
| o. = O = |
| + O O + |
| o = * |
| o |
+----[SHA256]-----+
[ansibleman@ansiblesv ansible]$
[ansibleman@ansiblesv ansible]$ ls -l ~/.ssh
total 12
-rw-------. 1 ansibleman ansibleman 65 Apr 21 20:26 config
-rw-------. 1 ansibleman ansibleman 365 May 4 08:48 id_ecdsa
-rw-r--r--. 1 ansibleman ansibleman 285 May 4 08:48 id_ecdsa.pub
[ansibleman@ansiblesv ansible]$
playbook ファイル
■ site.ymlsystemd モジュールで sshd.service を再起動すると対象ホストとの ssh 接続が中断する。対策として shell モジュールで sshd.service を非同期で再起動し、wait_for_connection モジュールで接続待ちをしている
--- - hosts: all tasks: - name: 公開鍵を登録する authorized_key: user: workman state: present key: "{{ lookup('file', '~/.ssh/id_ecdsa.pub') }}" - name: root アカウントによるログインを禁止 lineinfile: path: /etc/ssh/sshd_config insertafter: '#PermitRootLogin yes' line: 'PermitRootLogin no' become: yes - name: パスワード認証を禁止 lineinfile: path: /etc/ssh/sshd_config regexp: 'PasswordAuthentication yes' line: 'PasswordAuthentication no' become: yes - name: sshd サービスを再起動する(非同期処理) shell: systemctl restart sshd.service async: 5 poll: 0 become: yes - name: SSH セッション再接続待ち wait_for_connection: delay: 10 timeout: 300 - name: 疎通確認 ping: register: result - name: 疎通確認の結果を表示 debug: var: result■ 実行結果
[ansibleman@ansiblesv ansible]$ ansible-playbook -i hosts.yml site.yml
PLAY [all] *********************************************************************
TASK [Gathering Facts] *********************************************************
ok: [node-c0706]
TASK [公開鍵を登録する] ****************************************************************
changed: [node-c0706]
TASK [root アカウントによるログインを禁止] ****************************************************
changed: [node-c0706]
TASK [パスワード認証を禁止] **************************************************************
changed: [node-c0706]
TASK [sshd サービスを再起動する(非同期処理)] **************************************************
changed: [node-c0706]
TASK [SSH セッション再接続待ち] **********************************************************
ok: [node-c0706]
TASK [疎通確認] ********************************************************************
ok: [node-c0706]
TASK [疎通確認の結果を表示] **************************************************************
ok: [node-c0706] => {
"result": {
"changed": false,
"failed": false,
"ping": "pong"
}
}
PLAY RECAP *********************************************************************
node-c0706 : ok=8 changed=4 unreachable=0 failed=0
[ansibleman@ansiblesv ansible]$
■ 実行前アカウント workman / root ともにパスワード認証でログインに成功した
[ansibleman@ansiblesv ~]$ ssh 192.168.101.21 -l workman
Warning: Permanently added '192.168.101.21' (ECDSA) to the list of known hosts.
workman@192.168.101.21's password:
Last login: Thu Apr 25 21:10:04 2019 from 192.168.101.224
[workman@node-c0706 ~]$
[workman@node-c0706 ~]$ logout
Connection to 192.168.101.21 closed.
[ansibleman@ansiblesv ~]$
[ansibleman@ansiblesv ~]$
[ansibleman@ansiblesv ~]$ ssh 192.168.101.21 -l root
Warning: Permanently added '192.168.101.21' (ECDSA) to the list of known hosts.
root@192.168.101.21's password:
Last login: Thu Apr 25 21:10:21 2019 from 192.168.101.224
[root@node-c0706 ~]#
[root@node-c0706 ~]# logout
Connection to 192.168.101.21 closed.
[ansibleman@ansiblesv ~]$
■ 実行後 #1アカウント workman は鍵ファイルがあるのでログインが成功した。root アカウントはログインに失敗した
[ansibleman@ansiblesv ansible]$ ssh 192.168.101.21 -l workman
Warning: Permanently added '192.168.101.21' (ECDSA) to the list of known hosts.
Last login: Sat May 4 23:07:37 2019 from ansiblesv.exam.local
[workman@node-c0706 ~]$
[workman@node-c0706 ~]$ logout
Connection to 192.168.101.21 closed.
[ansibleman@ansiblesv ansible]$
[ansibleman@ansiblesv ansible]$ ssh 192.168.101.21 -l root
Warning: Permanently added '192.168.101.21' (ECDSA) to the list of known hosts.
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
[ansibleman@ansiblesv ansible]$
■ 実行後 #2鍵ファイルを削除し、パスワード認証でログインしようとしたが失敗した
ansibleman@ansiblesv ansible]$ ssh 192.168.101.21 -l workman
Warning: Permanently added '192.168.101.21' (ECDSA) to the list of known hosts.
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
[ansibleman@ansiblesv ansible]$