歴史的に、sudoの権利は
/etc/sudoers.dおよび
visudoのファイルの内容によって規制され、キー認証は
〜/ .ssh / authorized_keysを使用して
実行 されました 。 ただし、インフラストラクチャの成長に伴い、これらの権利を一元管理したいという要望があります。 現在までに、いくつかの解決策があります。
- 構成管理システム-Chef 、 Puppet 、 Ansible 、 Salt
- Active Directory + sssd
- スクリプト形式のさまざまな歪みとファイルの手動編集
私の主観的な意見では、集中管理の最良の選択肢は、
Active Directory +
sssdの束です。 このアプローチの利点は次のとおりです。
- 本当に単一の集中ユーザーディレクトリ。
- sudo権限の配布とは、特定のセキュリティグループにユーザーを追加することです。
- さまざまなLinuxシステムの場合、構成システムを使用するときにOSを決定するための追加のチェックを導入する必要があります。
本日のスイートは、単一のリポジトリに
sudo権限を管理し、
sshキーを保存するための
Active Directory +
sssdバンドル専用です。
それで、聴衆は緊張した静寂で凍りつき、指揮者は杖を上げ、オーケストラは準備をしました。
行こう
与えられた:
- Windows Server 2012 R2上のActive Directory ドメインtestopf.local 。
- Centos 7を実行しているLinuxホスト
- sssdを使用して構成された許可
どちらのソリューションも
Active Directoryスキーマに変更を加えるため、テスト環境ですべてを確認してから、作業インフラストラクチャに変更を加えます。 私は注意したい-すべての変更はポイントベースであり、実際には、必要な属性とクラスのみを追加します。
ステップ1: Active Directoryを使用して sudoロールを管理します。
Active Directoryスキーマを拡張するには、最新の
sudoリリース1.8.27を今日ダウンロードする必要があります。 展開し、
schema.ActiveDirectoryファイルを./docディレクトリからドメインコントローラーにコピーします。 ファイルをコピーしたディレクトリから管理者権限を持つコマンドラインから、次を実行します。
ldifde -i -f schema.ActiveDirectory -c dc=X dc=testopf,dc=local
(値を置き換えることを忘れないでください)
adsiedit.mscを開き、デフォルトのコンテキストに接続します。
ドメインのルートで、
sudoersユニットを作成し
ます 。 (ブルジョワは、
sssdデーモンが
sudoRoleオブジェクトを検索するのはこのユニットであると頑固に主張します。しかし、詳細なデバッグをオンにしてログを調べると、検索がディレクトリツリー全体で実行されることが明らかになりました。)
sudoRoleクラスに属するユニットに最初のオブジェクトを作成します。 この名前は、簡単に識別できるようにするためだけに、絶対に任意に選択できます。
スキーマ拡張から使用可能な属性のうち、主なものは次のとおりです。
- sudoCommand-ホストで実行できるコマンドを決定します。
- sudoHost-このロールが適用されるホストを決定します。 ALLとして、または名前で個々のホストに対して指定できます。 マスクを使用することもできます。
- sudoUser - sudoの実行を許可するユーザーを指定します。
セキュリティグループを指定する場合は、名前の先頭に「%」記号を追加します。 グループ名にスペースが含まれている場合、心配する必要はありません。 ログから判断すると、 sssdメカニズムはスペースをエスケープするタスクを引き受けます。
図1.ディレクトリのルートにあるsudoersユニットのsudoRoleオブジェクト図2. sudoRoleオブジェクトで指定されたセキュリティグループのメンバーシップ。次の構成は、Linux側で行われます。
/etc/nsswitch.confファイルで、ファイルの最後に次の行を追加します。
sudoers: files sss
[sssd]セクションの
/etc/sssd/sssd.confファイルで、
sudoをサービスに追加します
cat /etc/sssd/sssd.conf | grep services services = nss, pam, sudo
すべての操作の後、sssdデーモンのキャッシュをクリアする必要があります。 自動更新は6時間ごとに行われますが、なぜ今すぐに待つ必要があるのでしょうか。
sss_cache -E
キャッシュをクリアしても役に立たないことがよくあります。 次に、サービスを停止し、ベースをクリーンアップして、サービスを開始します。
service sssd stop rm -rf /var/lib/sss/db/* service sssd start
最初のユーザーの下で接続し、sudoからアクセスできることを確認します。
su user1 [user1@testsshad log]$ id uid=1109801141(user1) gid=1109800513(domain users) groups=1109800513(domain users),1109801132(admins_) [user1@testsshad log]$ sudo -l [sudo] password for user1: Matching Defaults entries for user1 on testsshad: !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin User user1 may run the following commands on testsshad: (root) /usr/bin/ls, /usr/bin/cat
2番目のユーザーでも同じことを行います。
su user2 [user2@testsshad log]$ id uid=1109801142(user2) gid=1109800513(domain users) groups=1109800513(domain users),1109801138(sudo_root) [user2@testsshad log]$ sudo -l Matching Defaults entries for user2 on testsshad: !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin User user2 may run the following commands on testsshad: (root) ALL
このアプローチにより、さまざまなユーザーグループのsudoロールを一元的に定義できます。
Active Directoryでのsshキーの保存と使用
スキームを少し拡張するだけで、Active Directoryユーザー属性にsshキーを保存し、Linuxホストでの承認に使用することができます。
sssdによる許可を構成する必要があります。
PowerShellスクリプトを使用して目的の属性を追加します。
AddsshPublicKeyAttribute.ps1関数New-AttributeID {
$プレフィックス= "1.2.840.113556.1.8000.2554"
$ GUID = [System.Guid] :: NewGuid()。ToString()
$パーツ= @()
$パーツ+ = [UInt64] ::解析($ guid.SubString(0.4)、“ AllowHexSpecifier”)
$パーツ+ = [UInt64] ::解析($ guid.SubString(4,4)、“ AllowHexSpecifier”)
$パーツ+ = [UInt64] ::解析($ guid.SubString(9,4)、 "AllowHexSpecifier")
$パーツ+ = [UInt64] ::解析($ guid.SubString(14,4)、“ AllowHexSpecifier”)
$パーツ+ = [UInt64] ::解析($ guid.SubString(19,4)、“ AllowHexSpecifier”)
$パーツ+ = [UInt64] ::解析($ guid.SubString(24.6)、「AllowHexSpecifier」)
$パーツ+ = [UInt64] ::解析($ guid.SubString(30.6)、「AllowHexSpecifier」)
$ oid = [String] ::形式( "{0}。{1}。{2}。{3}。{4}。{5}。{6}。{7}"、$ prefix、$ Parts [ 0]、
$パーツ[1]、$パーツ[2]、$パーツ[3]、$パーツ[4]、$パーツ[5]、$パーツ[6])
$ oid
}
$ schemaPath =(Get-ADRootDSE).schemaNamingContext
$ oid = New-AttributeID
$属性= @ {
lDAPDisplayName = 'sshPublicKey';
attributeId = $ oid;
oMSyntax = 22;
attributeSyntax = "2.5.5.5";
isSingleValued = $ true;
adminDescription = 'SSHログインのユーザー公開鍵';
}
New-ADObject -Name sshPublicKey -Type attributeSchema -Path $ schemapath -OtherAttributes $ attributes
$ userSchema = get-adobject -SearchBase $ schemapath -Filter 'name -eq "user"'
$ userSchema | Set-ADObject -Add @ {mayContain = 'sshPublicKey'}
属性を追加した後、Active Directoryドメインサービスを再起動します。
Active Directoryのユーザーに渡します。 便利な方法で、ssh接続用のキーペアを生成します。
PuttyGenを起動し、「生成」ボタンをクリックして、空の領域内でマウスを必死にクリックします。
プロセスが完了すると、公開キーと秘密キーを保存し、Active Directoryユーザー属性に公開キーを入力してプロセスを楽しむことができます。 ただし、公開鍵は、「
OpenSSH authorized_keysファイルに貼り付けるための公開鍵: 」ウィンドウから使用する必要があります。
ユーザー属性にキーを追加します。
オプション1-GUI:
オプション2-PowerShell:
get-aduser user1 | set-aduser -add @{sshPublicKey = 'AAAAB...XAVnX9ZRJJ0p/Q=='}
そのため、現時点では、sshPublicKey属性が設定されたユーザー、キー認証用に構成されたPuttyクライアントがあります。 1つの小さなポイントが残っています。sshdデーモンに、ユーザー属性から必要な公開キーを取得させる方法です。 ブルジョアインターネットのオープンスペースにある小さなスクリプトは、これにうまく対処します。
cat /usr/local/bin/fetchSSHKeysFromLDAP
ルートに0500のアクセス許可を設定します。
chmod 0500 /usr/local/bin/fetchSSHKeysFromLDAP
この例では、ディレクトリへのバインドに管理者アカウントが使用されます。 戦闘状態では、最小限の権利を持つ別個のアカウントが必要です。
私は個人的には、権限が設定されているにもかかわらず、スクリプト内の純粋な形式のパスワードの瞬間に非常に混乱していました。
ソリューションオプション:
今日のスイートの最後のコードはsshd_configの編集です
cat /etc/ssh/sshd_config | egrep -v -E "#|^$" | grep -E "AuthorizedKeysCommand|PubkeyAuthe" PubkeyAuthentication yes AuthorizedKeysCommand /usr/local/bin/fetchSSHKeysFromLDAP AuthorizedKeysCommandUser root
その結果、sshクライアントで構成されたキー認証で次のシーケンスを取得します。
- ユーザーはサーバーに接続し、ユーザー名を示します。
- sshdデーモンは、スクリプトを介して、Active Directoryのユーザー属性から公開キーの値を取得し、キーを承認します。
- sssdデーモンは、グループメンバーシップに基づいてユーザーをさらに認証します。 注意! これが構成されていない場合、すべてのドメインユーザーがホストにアクセスできます。
- sudoが試行すると、sssdデーモンはActive Directoryディレクトリでロールを検索します。 ロールがある場合、グループの属性とユーザーメンバーシップがチェックされます(sudoRolesがユーザーグループを使用するように構成されている場合)
まとめ
したがって、キーはActive Directoryユーザー属性、sudo許可に保存されます-同様に、ドメインアカウントによるLinuxホストへのアクセスは、Active Directoryグループのメンバーシップをチェックすることによって実行されます。
指揮者の杖の最後の波-ホールはa敬の念のない静けさで凍りついています。
書面で使用されるリソース: