シナリオ:ssh 接続の設定

2019/05/04

Ansible

 シナリオ

 「シナリオ:CentOS7.6.1810 を minimal インストールしたサーバーの初期設定」の続きです。今回は ssh 接続の設定です。前回は root アカウントで対象ホストにログインしました。今回は「シナリオ:CentOS7.6.1810 を minimal インストールしたサーバーの初期設定」で作成したアカウント workman でログインします。
  1. 鍵認証の設定
  2. root アカウントによるログインの禁止
  3. パスワード認証の禁止
  4. 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.yml
 systemd モジュールで 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]$ 

カテゴリー

目次

QooQ