Ansible:sshd_configにユーザーを追加する

Ansible:sshd_configにユーザーを追加する

新しい従業員が参加し、テストサーバーへのアクセスを許可する必要があります。通常、私はテンプレートを使用し、環境の種類に応じてこのテンプレートをサーバーにアップロードします。しかし、今回は別のアプローチを使用したいと思います。ユーザーが利用できない場合にのみsshd_config新しいユーザーを追加したいと思います。AllowUsers

モジュールを試しましたが、lineinfileこれまで成功しませんでした。

答え1

フィルタの使用コミュニティ、一般.jc分析する/etc/ssh/sshd_config

変数宣言

  sshd_conf: "{{ sshd_out.stdout|community.general.jc('sshd_conf') }}"

そしてファイルを読む

    - command: cat /etc/ssh/sshd_config
      register: sshd_out

構成済みリストのインポートユーザーを許可

  sshd_allow_users: "{{ sshd_conf.allowusers|d('')|split }}"

他のモジュールを使用してファイルを読み取ることもできます(slurp、fetchなど)。フィルタを使用するにはインストールする必要があります。提示コントローラから。インストールできない場合やインストールしたくない場合は、設定を自分で解決してください。コマンドの使用

    - command: sshd -T
      register: sshd_out

そして変数宣言

  sshd_allow_users: "{{ sshd_out.stdout_lines|
                        select('match', 'allowusers')|
                        map('split')|map('last') }}"

リストを追加して接続するユーザーのリストを宣言します。

  sshd_allow_users_add: [alice, bob]
  sshd_conf_update:
    AllowUsers: "{{ (sshd_allow_users + sshd_allow_users_add)|flatten|unique|sort }}"

たとえば、与えられたファイル

shell> grep AllowUsers /etc/ssh/sshd_config
AllowUsers cloe

更新

    - lineinfile:
        path: /etc/ssh/sshd_config
        firstmatch: true
        regexp: '^\s*{{ item.key }}\s+(.*)$'
        line: "{{ item.key }} {{ item.value|join(' ') }}"
        validate: sshd -t -f %s
      loop: "{{ sshd_conf_update|dict2items }}"

譲歩--OK--違いモデル

TASK [lineinfile] ********************************************************************
--- before: /etc/ssh/sshd_config (content)
+++ after: /etc/ssh/sshd_config (content)
@@ -127,4 +127,4 @@
 #  AllowTcpForwarding no
 #  PermitTTY no
 #  ForceCommand cvs server
-AllowUsers cloe
+AllowUsers alice bob cloe

changed: [localhost] => (item={'key': 'AllowUsers', 'value': ['alice', 'bob', 'cloe']})

テストのための完全なプレイブックの例

- hosts: all
  become: true

  vars:

    sshd_allow_users_add: [alice, bob]
    sshd_conf_update:
      AllowUsers: "{{ (sshd_allow_users + sshd_allow_users_add)|flatten|unique|sort }}"

    sshd_conf: "{{ sshd_out.stdout|community.general.jc('sshd_conf') }}"
    sshd_allow_users: "{{ sshd_conf.allowusers|d('')|split }}"

  tasks:

    - command: cat /etc/ssh/sshd_config
      register: sshd_out
      check_mode: false
      changed_when: false

    - debug:
        msg: |
          sshd_conf:
           {{ sshd_conf|to_yaml|indent(2) }}
          sshd_allow_users_add: {{ sshd_allow_users_add }}
          sshd_conf_update:
            {{ sshd_conf_update|to_yaml|indent(2) }}
      when: debug|d(false)|bool
 
    - lineinfile:
        path: /etc/ssh/sshd_config
        firstmatch: true
        regexp: '^\s*{{ item.key }}\s+(.*)$'
        line: "{{ item.key }} {{ item.value|join(' ') }}"
        validate: sshd -t -f %s
      loop: "{{ sshd_conf_update|dict2items }}"

尋ねる:「分割」というフィルタはありません。

答え:フィルタ分ける2.11から利用可能です。このフィルタが利用できない場合は、この方法を使用してください。分かれる()最初のケース

  sshd_allow_users: "{{ (sshd_conf.allowusers|d('')).split() }}"

そしてフィルターを使う正規表現_交換2番目のケース

  sshd_allow_users: "{{ sshd_out.stdout_lines|
                        select('match', 'allowusers')|
                        map('regex_replace', '^(.*) (.*)$', '\\2') }}"

答え2

正直そうな感じです。XYの問題- 問題に対する特定の解決策を実装する方法を尋ねましたが、その解決策は...せいぜい次善策です。

開梱してみましょう。テストサーバーに接続する権限を持つ新しい従業員がSSHを介して接続できることを確認したいので、ファイルにAllowUsersリストを保持してこれを実行しようとしていますsshd_config。これを行うと、Ansibleを使用して任意の設定ファイルを変更するのが難しくなり、lineinfile問題が発生する可能性があるという問題に直面します。

この特定の方法をどれだけ好むかに応じて、いくつかの可能なオプションがあります。

1つは、Sotto Voceがすでに指摘したように、ファイルにユーザーを明示的に割り当てるのではなく、システムレベルのグループを作成し、そのユーザーをモジュールのansibleを介して一般的な方法でグループsshd_configに追加し、次のようなものがあるかどうかを確認することですです。グループ。ssh_allowedansible.builtin.usersshd_configAllowGroup ssh_allowed

2つの最新バージョンのsshdがこのInclude説明をサポートしています。あなたの場合は手動で確認する必要があるかもしれません。それからもっと簡単な解決策があります。

まず行を追加してください。

Include /etc/ssh/sshd_config.d/*.conf

基本sshd_config構成ファイルの場合は、組み込みテンプレートから生成できるファイルを生成します。/etc/ssh/sshd_config.d/01-authusers.confこれは、残りのサーバーレベルの sshd 構成とは完全に独立しているためです。

答え3

(もともとコメントでしたが答えに移しました)

AllowGroups同様の操作を実行すると、ファイルの1行に静的グループリストを使用sshd_configし、一般的なUnix / Linuxグループメンバーシップを介してアクセスを管理しました。グループメンバーシップを管理するためのAnsible(または他の構成管理スイート)のツールは、sshd_configファイルの中間を編集するよりもはるかに簡単です。ユーザー名と一致する基本グループを持つユーザーを作成する一般的な慣行によれば、次のことをAllowGroups許可できます。個人ユーザーはもちろん、グループも同様です。

AllowGroups/は、AllowUsersほとんどの人が期待していない方法で動作します。 / lineAllowGroupsにグループ/ユーザーがいる場合AllowUsers回線ではグループ/ユーザーのみ許可SSH経由でログインしてください。 他のすべてのグループ/ユーザーは拒否されます。 IMOに名前を付けAllowOnlyTheseGroupsて、AllowOnlyTheseUsersその仕組みをより正確に説明します。

AllowGroups複数行またはファイルの行を構成しようとするときはAllowUsers注意してくださいsshd_config。これら2つのパラメータは、他のほとんどのSSH設定パラメータと似ています。つまり、構成ファイルに表示される最初のパラメーターが優先されます。 2回目、3回目などの発生は無視されます。に登場してもInclude

関連情報