AnsibleでOpenLDAP環境構築 -⑦ldapクライアント インストール

投稿者: | 2018年1月26日

せっかくだから、ldapクライアント構築もansibleでやっちゃいます。


ldapクライアント環境要件

リソース 要件 備考
ディストリビューション(OS) CentOS7.4 ※CentOS7系だったら大きな変化は無し
ホスト名 ldapclient 任意
IPアドレス 192.168.3.7/24 自宅環境なのでクラスCアドレス
ゲートウェイ 192.168.3.1 自宅HGW
ネームサーバ 192.168.3.1 自宅HGW

■ldapクライアント構築用playbook

一応、9.OpenLDAPクライアントの構築の例に沿って、以下の内容でplaybookを作成してみた。

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

※内容はAnsibleでOpenLDAP環境構築 -⑤ldapユーザをssh鍵認証でログインするための設定で作成したplaybookと99.5%変わらず。11行目にopenldap-clientsのインストールを追加しただけ。

が、一応念のため。。。以下、各モジュールの説明。

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

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

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

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

name:(8、17、25、66、69、75、78、86、93、100、107、113、119行目)
ansible-playbookコマンドを実行した際に、実行結果に出力させる文字列を指定する。

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

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

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

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

lineinfile:(26、79、87、94、101、120行目)
指定したファイルの編集を行うモジュール。こちらもモジュール引数を説明する。

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

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

service:(70、108、114行)
デーモン(サービス)の操作を行う場合に指定する。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再起動後、デーモン(サービス)を自動起動させない。

■/etc/ansible/hostsの設定

次はhostsの設定。hostsファイルは通称「インベントリ」という。
上記playbookでhostsモジュールに「ldapclient」と記述しているので、インベントリにその記述を追記する。

[root@ansible_sv ~]# vi /etc/ansible/hosts
[ldap_sv]
192.168.3.6
[ldapclient]    ⇒追記
192.168.3.7    ⇒追記

「:wq!」viを保存終了すればOK。

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

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

[root@ansible_sv ~]# ansible-playbook /etc/ansible/yml/7_ldapClient-create.yml
SSH password:

PLAY [ldapclient] ************************************************************************************************************************************

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

[root@ansible_sv ~]#

いけましたー!

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

■ldapクライアントで事後確認

事後確認もAnsibleでOpenLDAP環境構築 -⑤ldapユーザをssh鍵認証でログインするための設定と同じことをldapクライアントで実行する。
ここで事後確認するポイントは、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@ldapclient ~]# ls -l /etc/sssd
合計 4
drwx--x--x. 2 sssd sssd   6 12月  6 00:35 conf.d
-rw-------. 1 root root 821  1月 26 10:49 sssd.conf
[root@ldapclient ~]# 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@ldapclient ~]#

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

[root@ldapclient ~]# ls -l /etc/ssh
合計 608
-rw-r--r--. 1 root root     581843 10月 20 06:52 moduli
-rw-r--r--. 1 root root       2276 10月 20 06:52 ssh_config
-rw-r-----. 1 root ssh_keys    227  1月 26 09:58 ssh_host_ecdsa_key
-rw-r--r--. 1 root root        162  1月 26 09:58 ssh_host_ecdsa_key.pub
-rw-r-----. 1 root ssh_keys    387  1月 26 09:58 ssh_host_ed25519_key
-rw-r--r--. 1 root root         82  1月 26 09:58 ssh_host_ed25519_key.pub
-rw-r-----. 1 root ssh_keys   1675  1月 26 09:58 ssh_host_rsa_key
-rw-r--r--. 1 root root        382  1月 26 09:58 ssh_host_rsa_key.pub
-rw-------. 1 root root       3951  1月 26 10:49 sshd_config
-rw-------. 1 root root       3907 10月 20 06:52 sshd_config.7225.2018-01-26@10:47:38~
[root@ldapclient ~]# 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@ldapclient ~]#

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

[root@ldapclient ~]# 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-26 10:49:40 JST; 54min ago
 Main PID: 9471 (sssd)
   CGroup: /system.slice/sssd.service
           tq9471 /usr/sbin/sssd -i -f
           tq9472 /usr/libexec/sssd/sssd_be --domain default --uid 0 --gid 0 --debug-to-files
           tq9473 /usr/libexec/sssd/sssd_nss --uid 0 --gid 0 --debug-to-files
           tq9474 /usr/libexec/sssd/sssd_sudo --uid 0 --gid 0 --debug-to-files
           tq9475 /usr/libexec/sssd/sssd_pam --uid 0 --gid 0 --debug-to-files
           mq9476 /usr/libexec/sssd/sssd_ssh --uid 0 --gid 0 --debug-to-files

 1月 26 10:49:40 ldapclient systemd[1]: Starting System Security Services Daemon...
 1月 26 10:49:40 ldapclient sssd[9471]: Starting up
 1月 26 10:49:40 ldapclient sssd[be[default]][9472]: Starting up
 1月 26 10:49:40 ldapclient sssd[sudo][9474]: Starting up
 1月 26 10:49:40 ldapclient sssd[pam][9475]: Starting up
 1月 26 10:49:40 ldapclient sssd[ssh][9476]: Starting up
 1月 26 10:49:40 ldapclient sssd[nss][9473]: Starting up
 1月 26 10:49:40 ldapclient systemd[1]: Started System Security Services Daemon.
[root@ldapclient ~]# 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-26 10:49:41 JST; 55min ago
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 9514 (sshd)
   CGroup: /system.slice/sshd.service
           mq9514 /usr/sbin/sshd -D

 1月 26 10:49:41 ldapclient systemd[1]: Starting OpenSSH server daemon...
 1月 26 10:49:41 ldapclient sshd[9514]: /etc/ssh/sshd_config line 140: Deprecated option RSAAuthentication
 1月 26 10:49:41 ldapclient sshd[9514]: Server listening on 0.0.0.0 port 22.
 1月 26 10:49:41 ldapclient sshd[9514]: Server listening on :: port 22.
 1月 26 10:49:41 ldapclient systemd[1]: Started OpenSSH server daemon.
[root@ldapclient ~]#

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

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

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

teratermからsshログインできるか確認

AnsibleでOpenLDAP環境構築 -⑥ldapユーザにssh鍵認証設定で、ssh秘密鍵/公開鍵を生成したので、秘密鍵「id_ed25519」の方をteratermが使える端末にWinSCP等で転送しておこう。
あとはteratermを起動して、ldapクライアントにsshアクセスして、
ユーザ名:user01
パスフレーズ:sshmanager
秘密鍵:「id_ed25519」を選択
で、sshログインできます\(^o^)/

コメントを残す

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

CAPTCHA