GNU/Linux >> Linux の 問題 >  >> Linux

AnsibleSSH認証と特権昇格

この記事では、2つの重要なAnsibleの概念に焦点を当てます。最初の概念は、SSHキーベースおよびパスワードベースの認証がAnsibleでどのように機能するかです。 2番目の概念は、アドホックコマンドやプレイブックを操作するときに特権を上げる方法です。

VirtualBoxとVagrantを使用してUbuntu20.04LTSマシンを実行する3ノードのラボセットアップがあります。以下のリンクから読むことができるラボのセットアップに関する詳細な記事があります。

  • LinuxでのVagrantとVirtualboxによる自動化されたAnsibleラボのセットアップ

Ansibleでのキーベースの認証

ansibleを学習するときに最初に理解する必要があるのは、コントローラーと管理対象ノードの間で通信がどのように行われているかです。 AnsibleはSSHプロトコルを使用します 管理対象ノードに接続してタスクを実行します。

プレイブックまたはアドホックコマンドを実行するたびに、SSH経由で管理対象ノードに対して認証できるようにするためのSSHパスワードを提供する必要があります。

これを排除するには、SSHキーペアを作成し、公開キーをすべてのノードと共有して、ansibleがキーペアを使用して通信できるようにすることをお勧めします。

first_keyという名前の2つのキーペアを作成しました およびsecond_key 以下のスクリプトを使用してデモンストレーションを行います。

create_keypair.shというテキストファイルを作成します 以下の内容で。

#!/usr/bin/env bash

# THIS SCRIPT WILL CREATE SSH KEY PAIR AND DISTRIBUTE ACROSS ALL NODES

read -p "Enter the name for the key : " KEY_NAME
ssh-keygen -b 2048 -t rsa -f /home/vagrant/.ssh/${KEY_NAME} -q -N ""

# LOOPING THROUGH AND DISTRIBUTING THE KEY

for val in controller managed1 managed2; do
    echo "-------------------- COPYING KEY TO ${val^^} NODE ------------------------------"
    sshpass -p 'vagrant' ssh-copy-id -f -i /home/vagrant/.ssh/${KEY_NAME}.pub -o "StrictHostKeyChecking=no" [email protected]$val
done

スクリプトに実行権限を与えて実行します。

$ chmod +x path/to/create_keypair.sh
$ ./create_keypair.sh

ラボのセットアップ用にこのスクリプトを作成しました。 forループセクションを編集し、それに応じて管理対象ノード名を追加できます。

$ tree .ssh/
.ssh/
├── authorized_keys
├── first_key
├── first_key.pub
├── known_hosts
├── second_key
└── second_key.pub

デフォルト名(id_rsa)以外の異なる名前で作成されたキーがある場合、sshはデフォルトのキー名を見つけようとし、見つからない場合は、パスワードベースの認証を求めるプロンプトを表示します。

debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey
debug1: Trying private key: /home/vagrant/.ssh/id_rsa
debug1: Trying private key: /home/vagrant/.ssh/id_dsa
debug1: Trying private key: /home/vagrant/.ssh/id_ecdsa
debug1: Trying private key: /home/vagrant/.ssh/id_ecdsa_sk
debug1: Trying private key: /home/vagrant/.ssh/id_ed25519
debug1: Trying private key: /home/vagrant/.ssh/id_ed25519_sk
debug1: Trying private key: /home/vagrant/.ssh/id_xmss
debug1: Next authentication method: password
[email protected]'s password:

この場合、-iを使用して秘密鍵ファイルに明示的に言及する必要があります フラグ。

$ ssh -v -i /home/vagrant/.ssh/first_key [email protected]

アドホックコマンドまたはプレイブックを実行するときは、--key-fileを使用できます。 または--private-key フラグを立てて、秘密鍵ファイルを引数として渡します。以下の例では、両方のキー(first_keyとsecond_key)を使用して管理対象ノードと正常に通信したことがわかります。

# USING --key-file FLAG

$ ansible managed1 -m ping --key-file /home/vagrant/.ssh/second_key

managed1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}
# USING --private-key FLAG

$ ansible managed1 -m ping --private-key /home/vagrant/.ssh/first_key

managed1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}

パラメータ「private_key_file」を追加することもできます "ansible.cfg内 アドホックコマンドとすべてのプレイブックタスクに適用される構成ファイル。

$ vim ansible.cfg
次の行を追加します。

Private_key_file = /home/vagrant/.ssh/first_key

/home/vagrant/.ssh/first_keyを置き換えます 自分で。

"ansible_ssh_private_key"を追加することもできます ansible.cfgよりも優先されるインベントリファイルのパラメータ ファイル。以下は私の在庫がどのように設定されているかです。ノードma​​naged1 "first_key"を使用します およびma​​naged2 "second_key"を使用します 。

[ubuntu1]
managed1 ansible_ssh_private_key_file=/home/vagrant/.ssh/first_key

[ubuntu2]
managed2 ansible_ssh_private_key_file=/home/vagrant/.ssh/second_key

これで、アドホックコマンドまたはプレイブックを再度実行すると、両方のキーが正常に認証されることがわかります。冗長性を高めて、入力に従って適切なキーが使用されているかどうかを確認できます。

$ ansible -vvv all -m ping

これで、キーベースの認証がansibleでどのように機能するかを十分に理解する必要があります。異なるファイルにパラメータを追加するときは、優先順位を理解することが重要です。コマンドラインオプションの優先順位が高くなり、インベントリファイルとansible.cfgがそれに続きます 構成ファイル。

AnsibleでのSSHパスワードベースの認証

タスクを実行すると、ansibleはコントローラーノードの現在のユーザーを使用して、SSHを介して管理対象ノードと通信します。シェルモジュールを使用して、「whoami」を実行できます "管理対象ノードのユーザー名を確認するコマンド。私の場合、ユーザー名は" vagrant " 。放浪者のユーザーは、前のセクションで設定したキーを使用して認証しています。

$ whoami
vagrant
$ ansible all -m shell -a "whoami"
managed2 | CHANGED | rc=0 >>
vagrant
managed1 | CHANGED | rc=0 >>
vagrant

別のユーザーとして管理対象ノードに接続する場合は、--uを使用できます。 または--user フラグを立て、引数としてユーザー名を渡します。下の画像を見ると、SSHキーが設定されておらず、管理対象ノードにキーが配布されていないため、接続に失敗しているユーザー「karthick」を使用しようとしています。

$ ansible all -m shell -a "whoami" -u karthick
$ ansible all -m shell -a "whoami" --user karthick

パスワードベースの認証を使用するには、-kを使用できます または--ask-pass 国旗。ユーザー(karthick)のSSHパスワードを入力するように求められます。パスワードがユーザーのすべてのノードで同じであることを確認してください。

$ ansible all -m shell -a "whoami" -u karthick -k
$ ansible all -m shell -a "whoami" -u karthick --ask-pass

パスワードをファイルに保存し、ファイル名を引数として--connection-password-fileに渡すこともできます。 または--conn-pass-file 国旗。パスワードをプレーンテキストファイルに保存しているため、これは推奨される方法ではありません。 Ansible Vaultを使用してパスワードファイルを暗号化できますが、これは別のトピックです。

$ ansible all -m shell -a "whoami" -u karthick --connection-password-file pass.txt
$ ansible all -m shell -a "whoami" -u karthick --conn-pass-file pass.txt

ユーザー名とパスワードをインベントリファイルのパラメータとして渡すこともできます。繰り返しますが、これはパスワードを保存するための最良の方法ではありません。以下は、インベントリファイルの設定方法です。

[ubuntu1]
managed1 ansible_ssh_private_key_file=/home/vagrant/.ssh/first_key ansible_user=vagrant

[ubuntu2]
managed2 ansible_user=karthick ansible_ssh_pass=password
$ ansible all -m shell -a "whoami" -u karthick

managed1 | CHANGED | rc=0 >>
vagrant
managed2 | CHANGED | rc=0 >>
karthick

ヘッズアップ: アドホックコマンドを使用して例を実行している可能性がありますが、同じフラグがプレイブックにも適用されます。

Ansibleでの特権昇格

タスクを正常に実行するには、昇格された特権(root)が必要な場合があります。たとえば、パッケージ管理。パッケージのインストール、削除、またはアップグレードは、rootとしてのみ可能です。 ユーザーまたはsudo 特権。

ansibleまたはansible-playbookと一緒にヘルプフラグを実行すると、画像に示すように特権昇格セクションが表示されます。

$ ansible --help
$ ansible-playbook --help

rootを使用してタスクを実行する場合 特権、-bを使用する必要があります または--become フラグ。

$ ansible ubuntu1 -m service -a "name=sshd state=restarted" -b

managed1 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": true,
    "name": "sshd",
    "state": "started",

デフォルトでは、sudo 特権昇格方法として使用されます。 --become-methodを設定することで、メソッドを変更できます 国旗。次のコマンドを実行すると、サポートされているメソッドのリストを取得できます。

$ ansible-doc -t become -l

ansible.netcommon.enable     Switch to elevated permissions on a network device                                                             
community.general.doas       Do As user                                                                                                     
community.general.dzdo       Centrify's Direct Authorize                                                                                    
community.general.ksu        Kerberos substitute user                                                                                       
community.general.machinectl Systemd's machinectl privilege escalation                                                                      
community.general.pbrun      PowerBroker run                                                                                                
community.general.pfexec     profile based execution                                                                                        
community.general.pmrun      Privilege Manager run                                                                                          
community.general.sesu       CA Privileged Access Manager                                                                                   
community.general.sudosu     Run tasks using sudo su -                                                                                  
runas                        Run As user                                                                                                   
su                           Substitute User                                                                                               
sudo                         Substitute User DO 

sudoを与える場合と与えない場合があります ユーザーの設定方法に応じた管理対象ノードのパスワード。私の場合、ユーザーを vagrantに設定しました sudoを実行するには パスワードの入力を求めずに。

sudoの場合 ユーザーが機能するにはパスワードが必要です。その場合は、-Kを使用する必要があります または--ask-become-pass sudoの入力を求めるフラグ パスワード。

以下のエラーからわかるように、sudoを指定せずに実行しようとすると ユーザー「karthick」のパスワード、「sudoパスワードがありません」というエラーが表示されます 。

$ ansible ubuntu1 -m service -a "name=sshd state=restarted" -i inventory -u karthick -k -b

SSH password:
managed1 | FAILED! => {
    "msg": "Missing sudo password"
}
$ ansible ubuntu1 -m service -a "name=sshd state=restarted" -i inventory -u karthick -k -b -K

Sudoパスワードはファイルに保存して、引数として--become-password-fileに渡すことができます。 または--become-pass-file 国旗。 Ansibleボールトを使用してこのファイルを暗号化できますが、推奨される方法ではありません。

$ ansible ubuntu1 -m service -a "name=sshd state=restarted" -i inventory -u karthick -k -b --become-password-file pass.txt

$ ansible ubuntu1 -m service -a "name=sshd state=restarted" -i inventory -u karthick -k -b --become-pass-file pass.txt

「なる」を含めることもできます タスクレベルまたはプレイレベルでのプレイブックのディレクティブ。

下の画像は、「になる」の様子を表しています。 ディレクティブは再生レベルで使用されます 。

下の画像は、「になる」の様子を表しています。 ディレクティブはタスクレベルで使用されます 。

出力からわかるように、ssh managed1でサービスが正常に再起動されます ノード。

$ ansible-playbook restart_service.yml

PLAY [Restart SSHD service] ***************************************************************************

TASK [Restart SSHD in managed1.anslab.com] ************************************************************
changed: [managed1]

PLAY RECAP ********************************************************************************************
managed1 : ok=1 changed=1    unreachable=0     failed=0 skipped=0    rescued=0 ignored=0   

「become」ディレクティブは、 ansible.cfgでも設定できます。 構成ファイルとインベントリファイル。ただし、ハンドブックでディレクティブを設定することをお勧めします。 ansible.cfgのさまざまなパラメーターを取得できます 以下のリンクからファイルしてください。

  • ディレクティブになる

管理対象ノードに接続した後、別のユーザーとしてタスクを実行する場合は、--become-userを使用する必要があります。 国旗。デフォルトでは、rootに設定されています ユーザー。

結論

この記事では、キーベースの認証とパスワード認証がAnsibleでどのように機能するか、および認証でサポートされているさまざまなフラグについて説明しました。また、Ansibleで特権昇格がどのように機能するかを見てきました。

深く掘り下げるには、さまざまな特権昇格方法がどのように機能するかを公正に理解し、ニーズに応じてセキュリティを損なうことなく環境を設定する必要があります。

次を読む:

  • Ansibleアドホックコマンドの使用を開始する

Linux
  1. バイナリを /bin、/sbin、/usr/bin、および /usr/sbin にインストールし、 --prefix および DESTDIR と対話します

  2. unix:///var/run/supervisor.sock そのようなファイルはありません

  3. なぜ /home 以外のものを別のパーティションに入れるのですか?

  1. Linuxは複数の連続したパスセパレーター(/ home //// username /// file)をどのように処理しますか?

  2. Linux:/ dev / console、/ dev / tty、/ dev / tty0の違いは?

  3. 推奨される使用方法に従って、Web サイトは /var/ または /usr/ に配置する必要がありますか?

  1. Bash =〜正規表現とHttps://regex101.com/?

  2. / dev / stdin、/ dev / stdout、および/ dev / stderrはどの程度移植可能ですか?

  3. Sshが1台の特定のコンピューターから機能していませんか?