せっかくだから、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^)/