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成功!