AnsibleでOpenLDAP環境構築 -⑤ldapユーザをssh鍵認証でログインするための設定

投稿者: | 2018年1月25日

AnsibleでOpenLDAP環境構築 -④ldapユーザの設定の次はldapユーザをssh鍵認証でログインするための設定。

LDAP構築 まとめの例にならい、sssdパッケージを使用し、ldapクライアント相当の設定をOpenLDAPサーバに行う。


■ssh鍵認証用事前準備playbook

以下の内容でplaybookを作成してみた。

[root@ansible_sv ~]# vi /etc/ansible/yml/5_sssd_edit.yml
           1- hosts: ldap_sv
           2  remote_user: root
           3
           4  vars:
           5    gid: ldapmanager
           6
           7  tasks:
           8  - name: Yum install
           9    yum: name={{ item }} state=present
          10    with_items:
          11      - sssd
          12      - sssd-client
          13      - sssd-ldap
          14      - oddjob-mkhomedir
          15
          16  - name: sssd.conf create
          17    file:
          18      state=touch
          19      path=/etc/sssd/sssd.conf
          20      owner=root
          21      group=root
          22      mode=0600
          23
          24  - name: sssd.conf write
          25    lineinfile:
          26      dest=/etc/sssd/sssd.conf
          27      state=present
          28      line="{{ item }}"
          29    with_items:
          30      - '[sssd]'
          31      - 'debug_level = 0'
          32      - 'config_file_version = 2'
          33      - 'services = nss, sudo, pam, ssh'
          34      - 'domains = default'
          35      - '[domain/default]'
          36      - 'id_provider = ldap'
          37      - 'auth_provider = ldap'
          38      - 'chpass_provider = ldap'
          39      - 'sudo_provider = ldap'
          40      - 'ldap_uri = ldap://192.168.3.6'
          41      - 'ldap_search_base = dc=abc,dc=def,dc=com'
          42      - 'ldap_sudo_search_base = ou=SUDOers,dc=abc,dc=def,dc=com'
          43      - 'ldap_id_use_start_tls = False'
          44      - 'ldap_search_timeout = 3'
          45      - 'ldap_network_timeout = 3'
          46      - 'ldap_opt_timeout = 3'
          47      - 'ldap_enumeration_search_timeout = 60'
          48      - 'ldap_enumeration_refresh_timeout = 300'
          49      - 'ldap_connection_expire_timeout = 600'
          50      - 'ldap_sudo_smart_refresh_interval = 600'
          51      - 'ldap_sudo_full_refresh_interval = 10800'
          52      - 'entry_cache_timeout = 1200'
          53      - 'cache_credentials = True'
          54      - 'ldap_tls_reqcert = never'
          55      - '[nss]'
          56      - 'homedir_substring = /home'
          57      - 'entry_negative_timeout = 20'
          58      - 'entry_cache_nowait_percentage = 50'
          59      - '[pam]'
          60      - '[sudo]'
          61      - '[autofs]'
          62      - '[ssh]'
          63      - '[pac]'
          64
          65  - name: authconfig set 1
          66    shell: authconfig --enablesssd --enablesssdauth --enablelocauthorize --disableldap --disableldapauth --disableldaptls --update
          67
          68  - name: homedir start
          69    service:
          70      name=oddjobd
          71      state=started
          72      enabled=yes
          73
          74  - name: authconfig set 2
          75    shell: authconfig --enablemkhomedir --update
          76
          77  - name: sshd_config edit 1
          78    lineinfile:
          79      dest=/etc/ssh/sshd_config
          80      backup=yes
          81      state=present
          82      regexp='#RSAAuthentication yes'
          83      line='RSAAuthentication yes'
          84
          85  - name: sshd_config edit 2
          86    lineinfile:
          87      dest=/etc/ssh/sshd_config
          88      state=present
          89      regexp='PubkeyAuthentication'
          90      line='PubkeyAuthentication yes'
          91
          92  - name: sshd_config edit 3
          93    lineinfile:
          94      dest=/etc/ssh/sshd_config
          95      state=present
          96      regexp='AuthorizedKeysCommand '
          97      line='AuthorizedKeysCommand /usr/bin/sss_ssh_authorizedkeys'
          98
          99  - name: sshd_config edit 4
          100    lineinfile:
          101      dest=/etc/ssh/sshd_config
          102      state=present
          103      regexp='AuthorizedKeysCommandUser'
          104      line='AuthorizedKeysCommandUser root'
          105
          106  - name: sssd restart
          107    service:
          108      name=sssd
          109      state=restarted
          110      enabled=yes
          111
          112  - name: sshd restart
          113    service:
          114      name=sshd
          115      state=restarted
          116      enabled=yes
          117
          118  - name: edit sudoers
          119    lineinfile:
          120      dest=/etc/sudoers
          121      state=present
          122      line='%{{ gid }}  ALL=(ALL)       ALL'
          123      insertafter='%wheel'

/etc/sssd/sssd.confの内容(30~63行目)については9.OpenLDAPクライアントの構築を参照。

以下、各モジュールの説明。

hosts:(1行目)
処理を実行する対象ホストを指定。「ldap_sv」は/etc/ansible/hostsに記述したホスト名となる。

remote_user:(2行目)
hosts:で指定したホストで処理を実行する際に、どのユーザで処理を実行するかを指定。上記の例では先頭の階層に記述しているため、それ以降の全階層において適用される。

vars:(4行目)
変数を宣言するモジュール。変数の宣言は1行だけでなく複数可。またこの場合一番上位のhostsモジュールと同じ階層に位置されているので、それ以下のすべての階層に有効となる。

tasks:(7行目)
処理の内容を、tasks:以降に記述する。tasks:を記述しないとエラーになるので注意。

name:(8、16、24、65、68、74、77、85、92、99、106、112、118行目)
ansible-playbookコマンドを実行した際に、実行結果に出力させる文字列を指定する。

yum:(9行目)
yumコマンドを実行する。その際にモジュール引数というオプションのようなものを指定することができる。

モジュール引数 条件 説明
name= yumでインストールしたいパッケージ名を指定する。上記例では{{ item }}という変数を使用して複数のパッケージをインストールするようにしているが、
name=sssd,sssd-client,sssd-ldap,oddjob-mkhomedir
とカンマ区切りで一行で指定することも可能。
state= present パッケージがインストールされていなければインストールを行い、既にインストール済みの場合は何も行わない。
latest パッケージがインストールされていなければ最新版をインストールし、既にインストールされていれば最新版に更新する。
absent パッケージがインストールされていればアンインストールし、インストールされていなければ何も行わない。

file:(17行目)
ファイルやディレクトリの作成、アクセス権限の指定ができるモジュール。複数のモジュール引数が存在するので、以下の表に示す。

モジュール引数 条件 説明
path= ディレクトリやファイル、シンボリックリンクの位置をフルパスで指定する。
state= file pathで指定した既存のファイルを示す。もしファイルがない場合はcopyモジュールやtemplateモジュールが発動する。
link pathで指定したシンボリックリンクを示す。
directory pathで指定した既存のディレクトリを示す。ディレクトリがない場合はサブディレクトリとして作成され、アクセス権限は上位ディレクトリから継承される。
hard ハードリンクを指定する。
touch pathで指定したファイルを空の状態で作成する。linuxコマンドのtouchコマンドに相当する。
absent pathで指定したファイルやディレクトリ、シンボリックリックを削除する。
owner= ファイルのオーナーを指定する。lsコマンド等で表示されるオーナーの部分に当たる。
group= ファイルのグループを指定する。lsコマンド等で表示されるグループの部分に当たる。
mode= ファイルのアクセス権限を指定する。chmodコマンドに相当する。

lineinfile:(25、78、86、93、100、119行目)
指定したファイルの編集を行うモジュール。こちらもモジュール引数を説明する。

モジュール引数 条件 説明
dest= 編集するファイルをフルパスで指定する。
line= 「dest=」で指定したファイルに挿入する文字列を指定する。
state= present 「line=」で指定した文字列を、「dest=」で指定したファイルに挿入する。
もし「regexp=」で文字列を指定した場合は、「regexp=」で指定した文字列がある行が置換対象となり、「line=」で指定した文字列に行ごと置換される。「regexp=」で指定した文字列がファイルに存在しない場合は、「dest=」で指定したファイルの最後尾に挿入される。
absent 「regexp=」で指定した文字列に一致する行を削除する。一致しない場合は何も行わない。
削除したい行がなければ指定する必要なし。
create= yes 「dest=」で指定したファイルが存在しない場合、そのファイルを作成し「line=」で指定した文字列を記述する。
no 「dest=」で指定したファイルが存在しなくても、ファイルを作成しない。その場合lineinfileモジュールが実行失敗となるので注意。
regexp= 置換対象の文字列を指定する。state=presentの場合、「regexp=」で指定した文字列がある行を検索し、文字列があった場合は「line=」で指定した文字列に行ごと変換する。state=absentの場合は、「regexp=」で指定した文字列を行ごと削除する。
backup= yes ファイル編集の前に、「dest=」で指定したファイルと同じディレクトリにバックアップを保存するかどうかを指定する。「yes」を指定した場合、「<ファイル名>.[4~5桁の数字].YYYY-MM-DD@hh:mm:ss~」というファイル名でバックアップが保存される。バックアップしない場合は、「backup=」自体を記述しない。
insertafter= 「line=」で指定した文字列を、「insertafter=」で指定した文字列がある行の下に挿入する。その文字列がなかった場合は、ファイルの末尾に挿入される。
insertbefore= 「line=」で指定した文字列を、「insertbefore=」で指定した文字列がある行の上に挿入する。その文字列がなかった場合は、ファイルの末尾に挿入される。

with_items:(10、29行目)
「item」と記述したところに入る文字列を指定する。文字列は複数指定することができる。
実はここでも行頭に「-」が記述されているが、yml形式においては、ひとつのモジュールに対して複数の処理を当てはめる場合にこのような記述になるらしい。
上記例でも「task:」の中に複数の「- name:」があるのと同じ考えといったところだろうか。

shell:(66、75行目)
linuxコマンドを直接指定できる。類似モジュールで「command:」もあるが、shellは複数行記述できる。

service:(69、107、113行)
デーモン(サービス)の操作を行う場合に指定する。systemctlコマンドと同様。モジュール引数については以下の通り。

モジュール引数 条件 説明
name= デーモン(サービス)の名称を指定。OpenLDAPサーバの場合は「slapd」となる。systemctlコマンドで指定できるデーモン名は大体指定できるようだ。sshd、chronyd等。
state= started デーモン(サービス)を開始する。systemctl start コマンドと同様。
stopped デーモン(サービス)を停止する。systemctl stop コマンドと同様。
restarted デーモン(サービス)を再起動する。systemctl restart コマンドと同様。
reloaded デーモン(サービス)を再読み込みする。restartedと違い、デーモン自体の再起動は行わず設定を読み込む。postgresqlなんかはreloadする場合がある。
enabled= yes OS再起動後、デーモン(サービス)を自動起動させる。
no OS再起動後、デーモン(サービス)を自動起動させない。

playbookの内容は以下の投稿に沿って記述している。
7.OpenLDAPサーバの構築⑦ -LDAPユーザをlinuxユーザとして認識させる
8.OpenLDAPサーバの構築⑧ -ssh公開鍵をldapユーザのホームディレクトリに配置

※※※注意点※※※
122~126行では/etc/sudoersの設定を実行している。グループ(cn)がldapmanagerで、そのグループに所属するユーザに対しsudo権限を与えるもの。ここで注意すべきは、記述を間違えないこと。/etc/sudoersの編集は非常にシビアで、余計な文字が入ってたりするとシステム異常を起こすようだ。特に正規表現(改行コード等)などを含める場合は注意を。

 

■ansible-playbookコマンドでplaybookを実行

いよいよansibleの実行。コマンドは
# ansible-playbook <playbook名(フルパス)>

[root@ansible_sv ~]# ansible-playbook /etc/ansible/yml/5_sssd_edit.yml
SSH password:

PLAY [ldap_sv] ***************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************
ok: [192.168.3.6]

TASK [Yum install] ***********************************************************************************************************
changed: [192.168.3.6] => (item=[u'sssd', u'sssd-client', u'sssd-ldap', u'oddjob-mkhomedir'])

TASK [sssd.conf create] ******************************************************************************************************
changed: [192.168.3.6]

TASK [sssd.conf write] *******************************************************************************************************
changed: [192.168.3.6] => (item=[sssd])
changed: [192.168.3.6] => (item=debug_level = 0)
changed: [192.168.3.6] => (item=config_file_version = 2)
changed: [192.168.3.6] => (item=services = nss, sudo, pam, ssh)
changed: [192.168.3.6] => (item=domains = default)
changed: [192.168.3.6] => (item=[domain/default])
changed: [192.168.3.6] => (item=id_provider = ldap)
changed: [192.168.3.6] => (item=auth_provider = ldap)
changed: [192.168.3.6] => (item=chpass_provider = ldap)
changed: [192.168.3.6] => (item=sudo_provider = ldap)
changed: [192.168.3.6] => (item=ldap_uri = ldap://192.168.3.6)
changed: [192.168.3.6] => (item=ldap_search_base = dc=abc,dc=def,dc=com)
changed: [192.168.3.6] => (item=ldap_sudo_search_base = ou=SUDOers,dc=abc,dc=def,dc=com)
changed: [192.168.3.6] => (item=ldap_id_use_start_tls = False)
changed: [192.168.3.6] => (item=ldap_search_timeout = 3)
changed: [192.168.3.6] => (item=ldap_network_timeout = 3)
changed: [192.168.3.6] => (item=ldap_opt_timeout = 3)
changed: [192.168.3.6] => (item=ldap_enumeration_search_timeout = 60)
changed: [192.168.3.6] => (item=ldap_enumeration_refresh_timeout = 300)
changed: [192.168.3.6] => (item=ldap_connection_expire_timeout = 600)
changed: [192.168.3.6] => (item=ldap_sudo_smart_refresh_interval = 600)
changed: [192.168.3.6] => (item=ldap_sudo_full_refresh_interval = 10800)
changed: [192.168.3.6] => (item=entry_cache_timeout = 1200)
changed: [192.168.3.6] => (item=cache_credentials = True)
changed: [192.168.3.6] => (item=ldap_tls_reqcert = never)
changed: [192.168.3.6] => (item=[nss])
changed: [192.168.3.6] => (item=homedir_substring = /home)
changed: [192.168.3.6] => (item=entry_negative_timeout = 20)
changed: [192.168.3.6] => (item=entry_cache_nowait_percentage = 50)
changed: [192.168.3.6] => (item=[pam])
changed: [192.168.3.6] => (item=[sudo])
changed: [192.168.3.6] => (item=[autofs])
changed: [192.168.3.6] => (item=[ssh])
changed: [192.168.3.6] => (item=[pac])

TASK [authconfig set 1] ******************************************************************************************************
changed: [192.168.3.6]

TASK [homedir start] *********************************************************************************************************
changed: [192.168.3.6]

TASK [authconfig set 2] ******************************************************************************************************
changed: [192.168.3.6]

TASK [sshd_config edit 1] ****************************************************************************************************
changed: [192.168.3.6]

TASK [sshd_config edit 2] ****************************************************************************************************
changed: [192.168.3.6]

TASK [sshd_config edit 3] ****************************************************************************************************
changed: [192.168.3.6]

TASK [sshd_config edit 4] ****************************************************************************************************
changed: [192.168.3.6]

TASK [sssd restart] **********************************************************************************************************
changed: [192.168.3.6]

TASK [sshd restart] **********************************************************************************************************
changed: [192.168.3.6]

TASK [edit sudoers] **********************************************************************************************************
changed: [192.168.3.6]

PLAY RECAP *******************************************************************************************************************
192.168.3.6                : ok=14   changed=13   unreachable=0    failed=0

[root@ansible_sv ~]#

無事成功\(^o^)/

実行結果の説明はAnsibleでOpenLDAP環境構築 -①OpenLDAPサーバ関連のパッケージインストールを参照。

 

■OpenLDAPサーバで事後確認

念のためansible-playbookコマンドで実行したplaybookの内容がOpenLDAPサーバにちゃんと反映されたか確認。
ここで事後確認するポイントは、playbookに沿って以下。
・/etc/sssd/sssd.confがちゃんと作成され、アクセス権限も600であること。
・/etc/ssh/sshd_configの「RSAAuthentication yes」「PubkeyAuthentication yes」「AuthorizedKeysCommand /usr/bin/sss_ssh_authorizedkeys」「AuthorizedKeysCommandUser root」が問題なく記述されており、コメントアウトが外れていること。
・sssdサービス、sshdサービスが起動されていること。 ※特に/etc/sssd/sssd.confの記述がまずいと、sssdサービスはうまく起動されないのです。。。
・/etc/sudoersにグループ(cn)設定を行ったldapmanagerが記述されていること。

[root@ldapmanager ~]# ls -l /etc/sssd
合計 4
drwx--x--x. 2 sssd sssd   6 12月  6 00:35 conf.d
-rw-------. 1 root root 821  1月 24 12:00 sssd.conf
[root@ldapmanager ~]# cat /etc/sssd/sssd.conf
[sssd]
debug_level = 0
config_file_version = 2
services = nss, sudo, pam, ssh
domains = default
[domain/default]
id_provider = ldap
auth_provider = ldap
chpass_provider = ldap
sudo_provider = ldap
ldap_uri = ldap://192.168.3.6
ldap_search_base = dc=abc,dc=def,dc=com
ldap_sudo_search_base = ou=SUDOers,dc=abc,dc=def,dc=com
ldap_id_use_start_tls = False
ldap_search_timeout = 3
ldap_network_timeout = 3
ldap_opt_timeout = 3
ldap_enumeration_search_timeout = 60
ldap_enumeration_refresh_timeout = 300
ldap_connection_expire_timeout = 600
ldap_sudo_smart_refresh_interval = 600
ldap_sudo_full_refresh_interval = 10800
entry_cache_timeout = 1200
cache_credentials = True
ldap_tls_reqcert = never
[nss]
homedir_substring = /home
entry_negative_timeout = 20
entry_cache_nowait_percentage = 50
[pam]
[sudo]
[autofs]
[ssh]
[pac]
[root@ldapmanager ~]#

アクセス権限OK。ファイルの中身も大丈夫そうだが、改行コードを入れてないからちょっと見栄えが悪い 汗
lineinfileモジュールで作成したあと、replaceモジュールで改行コードを入れることはできる。やり方はまた別途。

[root@ldapmanager ~]# ls -l /etc/ssh
合計 608
-rw-r--r--. 1 root root     581843 10月 20 06:52 moduli
-rw-------. 1 root root       3907 10月 20 06:52 ssh_config
-rw-r-----. 1 root ssh_keys    227  1月 24 19:07 ssh_host_ecdsa_key
-rw-r--r--. 1 root root        162  1月 24 19:07 ssh_host_ecdsa_key.pub
-rw-r-----. 1 root ssh_keys    387  1月 24 19:07 ssh_host_ed25519_key
-rw-r--r--. 1 root root         82  1月 24 19:07 ssh_host_ed25519_key.pub
-rw-r-----. 1 root ssh_keys   1679  1月 24 19:07 ssh_host_rsa_key
-rw-r--r--. 1 root root        382  1月 24 19:07 ssh_host_rsa_key.pub
-rw-------. 1 root root       3951  1月 24 13:06 sshd_config
-rw-------. 1 root root       3907 10月 20 06:52 sshd_config.6396.2018-01-24@19:34:09~
[root@ldapmanager ~]# cat /etc/ssh/sshd_config
#       $OpenBSD: sshd_config,v 1.100 2016/08/15 12:32:04 naddy Exp $

# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.
        :
        :
#LoginGraceTime 2m
#PermitRootLogin yes
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10

PubkeyAuthentication yes

# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
# but this is overridden so installations will only check .ssh/authorized_keys
AuthorizedKeysFile      .ssh/authorized_keys

#AuthorizedPrincipalsFile none

AuthorizedKeysCommand /usr/bin/sss_ssh_authorizedkeys
AuthorizedKeysCommandUser root
        :
        :
RSAAuthentication yes
[root@ldapmanager ~]#

lineinfileモジュールでbackup=yesを記述しているので、「sshd_config.6396.2018-01-24@19:34:09~」というファイルが作成されている。
「#RSAAuthentication yes」がlineinfileモジュールのregexp(検索)に引っかからなかったため、「RSAAuthentication yes」が最後尾に記述されている。設定としては問題ないので、このままにする。それ以外の記述はOK。

[root@ldapmanager ~]# systemctl status sssd
 sssd.service - System Security Services Daemon
   Loaded: loaded (/usr/lib/systemd/system/sssd.service; enabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/sssd.service.d
           mqjournal.conf
   Active: active (running) since 木 2018-01-25 10:13:10 JST; 9s ago
 Main PID: 1261 (sssd)
   CGroup: /system.slice/sssd.service
           tq1261 /usr/sbin/sssd -i -f
           tq1262 /usr/libexec/sssd/sssd_be --domain default --uid 0 --gid 0 --debug-to-files
           tq1263 /usr/libexec/sssd/sssd_nss --uid 0 --gid 0 --debug-to-files
           tq1264 /usr/libexec/sssd/sssd_sudo --uid 0 --gid 0 --debug-to-files
           tq1265 /usr/libexec/sssd/sssd_pam --uid 0 --gid 0 --debug-to-files
           mq1266 /usr/libexec/sssd/sssd_ssh --uid 0 --gid 0 --debug-to-files

 1月 25 10:13:10 ldapmanager systemd[1]: Starting System Security Services Daemon...
 1月 25 10:13:10 ldapmanager sssd[1261]: Starting up
 1月 25 10:13:10 ldapmanager sssd[be[default]][1262]: Starting up
 1月 25 10:13:10 ldapmanager sssd[nss][1263]: Starting up
 1月 25 10:13:10 ldapmanager sssd[pam][1265]: Starting up
 1月 25 10:13:10 ldapmanager sssd[ssh][1266]: Starting up
 1月 25 10:13:10 ldapmanager sssd[sudo][1264]: Starting up
 1月 25 10:13:10 ldapmanager systemd[1]: Started System Security Services Daemon.
[root@ldapmanager ~]# systemctl status sshd
 sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since 木 2018-01-25 10:13:15 JST; 9s ago
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 1274 (sshd)
   CGroup: /system.slice/sshd.service
           mq1274 /usr/sbin/sshd -D

 1月 25 10:13:15 ldapmanager systemd[1]: Starting OpenSSH server daemon...
 1月 25 10:13:15 ldapmanager sshd[1274]: Server listening on 0.0.0.0 port 22.
 1月 25 10:13:15 ldapmanager sshd[1274]: Server listening on :: port 22.
 1月 25 10:13:15 ldapmanager sshd[1274]: /etc/ssh/sshd_config line 140: Deprecated option RSAAuthentication
 1月 25 10:13:15 ldapmanager systemd[1]: Started OpenSSH server daemon.
[root@ldapmanager ~]#

sssd、sshdともに無事に起動されている。

[root@ldapmanager ~]# visudo
        :
        :
# %wheel        ALL=(ALL)       NOPASSWD: ALL
%ldapmanager    ALL=(ALL)       ALL
        :
        :

/etc/sudoersもちゃんとldapmanagerグループが追加されていました!

playbook成功!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA