Turgon37.sudoers
Ansible Role Sudo/Sudoers
説明
:grey_exclamation: このロールを使用する前に、私のAnsibleロールはすべて私のITインフラに完全に書かれていることを理解してください。したがって、できるだけ一般的であっても、必ずしもあなたのニーズに合致するとは限りません。何を行うかを慎重に分析し、安全にサーバーにインストールできるかどうかを評価することをお勧めします。
このロールはsudoを設定します。
必要条件
Ansible >= 2.4が必要です。
依存関係
OSファミリー
このロールはDebianとCentOSで使用できます。
特徴
現時点で、このロールは次のことに使用できます:
- sudoをインストールする
- デフォルトおよびコマンドルールを設定する
- 他のロールがsudoルールを含むことを許可する疑似「タイプ」を提供する
- ローカルファクト
設定
ロール
上書きできるすべての変数は、defaults/main.ymlファイルおよび下の表に格納されています。デフォルト値については、このファイルを参照してください。
名称 | タイプ/値 | 説明 |
---|---|---|
sudoers__sss |
ブール値 | sssバックエンドでsudoを使用するために必要なパッケージをインストールする |
sudoers__defaults_(global/group/host) |
辞書/文字列のリスト | ロールレベルでのsudoersのデフォルト設定を宣言する |
sudoers__purge |
ブール値 | trueの場合、このロールによって直接処理されていないすべてのsudoルールを削除する |
sudoers__ansible_managed_key |
文字列 | Ansibleによって管理されているsudoルールを識別するための文字列 |
sudoers__rules_(global/group/host) |
ルールの辞書 (下記参照) | ロールレベルで適用するsudoersルール |
Sudoルール
このロールは、他のロールから使用できる疑似「タイプ」を提供します。これにより、他のロールがこのsudoersロールの範囲外で一連のsudoルールを宣言し、プレイブックで適用された後に実行できます。
使用するには、次のようにタスクを宣言します。
- name: ROLE用のsudoersルールを設定
include_role:
name: sudoers
tasks_from: types/sudo_rule
vars:
sudoers__sudo_rule: {}
ルール設定の項目はすべて、sudoers__sudo_rule
という名前の変数の下に置く必要があります。
名称 | タイプ/値 | 説明 |
---|---|---|
name |
文字列 | ルールファイルの名前(スペースを含まないこと) |
state |
列挙 absent/present | 必要に応じて削除するルールの状態 |
defaults |
デフォルトのリスト (下記参照) | このルールに適用するsudoersの「defaults」ディレクティブのリスト |
users |
文字列のリスト | このルールが適用されるユーザーのリスト |
hosts |
文字列のリスト | このルールが適用されるホストのオプションリスト(デフォルトはALL) |
commands |
コマンドのリスト (下記参照) | コマンド定義のリスト |
comment |
文字列 | ファイルに含めるオプションのコメント |
"defaults" ディレクティブ
sudoの "defaults" ディレクティブはオプションの値を取ることができるため、ansibleは各defaultsディレクティブに対して2つの形式をサポートします:
Defaults always_set_home
Defaults listpw = always
- 単純な文字列
- マッピング
文字列バージョンは最も使用が簡単で、文字列はsudoキーワードDefaultsの後ろに単純に配置されます。
マッピングバージョンはより細かい設定を可能にします。まず、sudo Defaultsディレクティブはホスト、ユーザー、コマンド、およびrunasフィルタリングをサポートすることを認識してください。ただし、デフォルトディレクティブのために1つのフィルタ条件しか選択できません。したがって、このansibleロールは、複数のフィルタリングキーを設定した場合、以前のキーの順序を優先順位として使用します。
ディレクティブが値を必要とする場合、ディレクティブ名をマッピングのキーとして設定し、その値をキーの値として関連付ける必要があります。
ディレクティブが名前だけ(例えば、requiretty)の場合、静的な単語 "defaults" をキーとして、ディレクティブの名前を値として設定する必要があります(制限があります)。
例えば、"requiretty"をuser1ユーザーに適用するには次の変数を設定します:
sudoers__sudo_rule:
name: rule1
defaults:
- defaults: requiretty
user: user1
そして、"listpw"を適用するには次のように設定します:
sudoers__sudo_rule:
name: rule1
defaults:
- listpw: always
user: user1
このように、これらの辞書キーは、defaults仕様の内部で利用可能です:
名称 | 使用方法 |
---|---|
defaults: NAME |
値がないディレクティブ用 |
NAME: VALUE |
値があるディレクティブ用 |
host: HOST |
指定されたホストに対するDefaultsの効果を制限する |
user: USER |
指定されたユーザーに対するDefaultsの効果を制限する |
command: COMMAND |
指定されたコマンドに対するDefaultsの効果を制限する |
runas: RUNAS_USER |
指定されたrunasユーザーに対するDefaultsの効果を制限する |
"commands" ディレクティブ
commandsキーの下の各コマンドは、ユーザーに制限ありまたはなしでシステムコマンドを実行させることができます。
コマンドブロックは、次のキーを許可します。
名称 | タイプ/値 | 使用法 |
---|---|---|
commands: |
文字列または文字列のリスト | コマンドパターン(構文仕様についてはman 5 sudoersを参照) |
run_as_user: |
文字列または文字列のリスト | この/これらのコマンド(上記)をこの/これらのユーザーとしてのみ実行する |
run_as_group: |
文字列または文字列のリスト | この/これらのコマンド(上記)をこの/これらのグループとしてのみ実行する |
tags |
文字列または文字列のリスト | このコマンドに適用するタグまたはタグのリスト |
例えば、ユーザー"user1"が特定の場所でパスワードなしでrootユーザーとしてlsを実行できるようにするには:
sudoers__sudo_rule:
name: rule1
commands:
- commands: /bin/ls
run_as_user: user1
run_as_group: root
tags: NOPASSWD
ファクト
デフォルトでは、ローカルファクトはインストールされ、次の変数が公開されます:
ansible_local.sudoers.version_full
ansible_local.sudoers.version_major
例
プレイブック
次のようにプレイブックで使用します:
- hosts: all
roles:
- turgon37.sudoers
インベントリ
- デフォルトの設定を宣言します
sudoers__defaults_global:
- always_set_home
- insults
- listpw: always
- mailsub: "[PRODUCTION][%h][SUDO SECURITY]"
- mailto: [email protected]
- mail_no_user
- mail_no_perms
- mail_no_host
- mail_badpass
- passprompt_override
- pwfeedback
- secure_path: /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
- '!visiblepw'
- sssdとの使用
# sudoがLDAPからルールを取得するために必要
sudoers__sss: true
- 他のロールからsudoルールを宣言します
- name: ROLE用のsudoersルールを設定
include_role:
name: sudoers
tasks_from: types/sudo_rule
vars:
sudoers__sudo_rule:
name: role__autogenerated_rule_10
remove_using_regexp:
- role__autogenerated_rule_0[0-9]+
force_remove_using_regexp: true
users: '{{ role__user }}'
hosts: ALL
comment: Autogenerated rule for role
commands:
- commands: /bin/ls
run_as_user: '{{ role__another_user }}'
run_as_group: root
tags: NOPASSWD
- commands: /bin/cat /home/[a-zA-Z]*/.ssh/config
run_as_user: ALL
run_as_group: root
defaults:
- defaults: '!requiretty'
user: '{{ role__user }}'
state: present