ステージでは、再び国際SSHおよびsudoコンテストの受賞者。 名誉指揮者Active Directoryの指導の下で

歴史的に、sudoの権利は/etc/sudoers.dおよびvisudoのファイルの内容によって規制され、キー認証は〜/ .ssh / authorized_keysを使用して実行 されました 。 ただし、インフラストラクチャの成長に伴い、これらの権利を一元管理したいという要望があります。 現在までに、いくつかの解決策があります。





私の主観的な意見では、集中管理の最良の選択肢は、 Active Directory + sssdの束です。 このアプローチの利点は次のとおりです。





本日のスイートは、単一のリポジトリにsudo権限を管理し、 sshキーを保存するためのActive Directory + 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クラスに属するユニットに最初のオブジェクトを作成します。 この名前は、簡単に識別できるようにするためだけに、絶対に任意に選択できます。



スキーマ拡張から使用可能な属性のうち、主なものは次のとおりです。







図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 #!/bin/sh ldapsearch -h testmdt.testopf.local -xb "dc=testopf,dc=local" '(sAMAccountName='"${1%@*}"')' -D Administrator@testopf.local -w superSecretPassword 'sshPublicKey' | sed -n '/^ /{H;d};/sshPublicKey:/x;$g;s/\n *//g;s/sshPublicKey: //gp'
      
      





ルートに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クライアントで構成されたキー認証で次のシーケンスを取得します。



  1. ユーザーはサーバーに接続し、ユーザー名を示します。
  2. sshdデーモンは、スクリプトを介して、Active Directoryのユーザー属性から公開キーの値を取得し、キーを承認します。
  3. sssdデーモンは、グループメンバーシップに基づいてユーザーをさらに認証します。 注意! これが構成されていない場合、すべてのドメインユーザーがホストにアクセスできます。
  4. sudoが試行すると、sssdデーモンはActive Directoryディレクトリでロールを検索します。 ロールがある場合、グループの属性とユーザーメンバーシップがチェックされます(sudoRolesがユーザーグループを使用するように構成されている場合)


まとめ



したがって、キーはActive Directoryユーザー属性、sudo許可に保存されます-同様に、ドメインアカウントによるLinuxホストへのアクセスは、Active Directoryグループのメンバーシップをチェックすることによって実行されます。



指揮者の杖の最後の波-ホールはa敬の念のない静けさで凍りついています。



書面で使用されるリソース:






All Articles