國際大賽SSH和sudo的得獎者再次登上舞台。 由傑出的 Active Directory 指揮領導

從歷史上看,sudo 權限是由以下文件的內容控制的 /etc/sudoers.d и visudo命令,並使用密鑰授權進行 〜/.ssh/authorized_keys。 然而,隨著基礎設施的發展,人們希望集中管理這些權利。 今天可能有幾種解決方案可供選擇:

  • 配置管理系統 - 廚師, 木偶, Ansible,
  • 活動目錄 + 固態硬盤
  • 腳本和手動文件編輯形式的各種變態

個人認為,集中管理的最佳選擇仍然是組合 活動目錄 + 固態硬盤。 這種方法的優點是:

  • 真正的單一集中式使用者目錄。
  • 權利分配 須藤 歸根結底是將使用者新增至特定的安全群組。
  • 對於各種Linux系統,在使用配置系統時有必要引入額外的檢查來確定作業系統。

今天的套件將專門致力於連接 活動目錄 + 固態硬盤 用於權限管理 須藤 和儲存 SSH 單一儲存庫中的金鑰。
於是,大廳陷入了緊張的沉默,指揮舉起指揮棒,樂團準備就緒。
走吧

鑑於:
— 活動目錄域 testopf.local 在 Windows Server 2012 R2 上。
— 運行 Centos 7 的 Linux 主機
— 設定授權使用 固態硬盤
兩種解決方案都對架構進行了更改 活動目錄,因此我們在測試環境中檢查所有內容,然後才對工作基礎架構進行更改。 我想指出的是,所有更改都是有針對性的,事實上,僅添加必要的屬性和類別。

動作一:控制 須藤 角色透過 活動目錄.

擴大電路 活動目錄 你需要下載最新版本 須藤 — 1.8.27 年 XNUMX 月 XNUMX 日起。 解壓縮並複製文件 架構.ActiveDirectory 從 ./doc 目錄到網域控制器。 從複製檔案的目錄中具有管理員權限的命令列中,執行:
ldifde -i -f schema.ActiveDirectory -c dc=X dc=testopf,dc=local
(不要忘記替換你的價值觀)
打開 adsiedit.msc 並連接到預設上下文:
在域的根部創建一個分區 sudoers文件。 (資產階級頑固地聲稱,正是在這個單位裡,惡魔 固態硬盤 搜尋一個項目 sudo角色 對象。 然而,在打開詳細偵錯並研究日誌後,發現搜尋是在整個目錄樹中執行的。)
我們創建屬於該類別的第一個對象 sudo角色。 這個名稱可以完全任意選擇,因為它僅用於方便識別。
在架構擴展的可能可用屬性中,主要的屬性如下:

  • sudo命令 — 決定允許在主機上執行哪些指令。
  • sudo主機 — 決定該角色適用於哪些主機。 可以指定為 全部,並針對單一主機的名稱。 也可以使用面罩。
  • sudo用戶 — 指示允許哪些使用者執行 須藤.
    如果指定安全性群組,請在名稱開頭新增「%」符號。 如果群組名稱中有空格,則無需擔心。 從日誌來看,轉義空格的任務被機制接手了 固態硬盤.

國際大賽SSH和sudo的得獎者再次登上舞台。 由傑出的 Active Directory 指揮領導
圖 1. 根目錄中 sudoers 細分中的 sudoRole 對象

國際大賽SSH和sudo的得獎者再次登上舞台。 由傑出的 Active Directory 指揮領導
圖 2. sudoRole 物件中指定的安全群組中的成員資格。

以下設定是在 Linux 端完成的。
在文件中 /etc/nsswitch.conf 將行新增至文件末尾:

sudoers: files sss

在文件中 /etc/sssd/sssd.conf 在部分 [SSD] 新增到服務 須藤

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

我們對第二個使用者執行相同的操作:

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 金鑰

透過稍微擴展該方案,可以將 ssh 密鑰儲存在 Active Directory 使用者屬性中,並在 Linux 主機上授權時使用它們。

必須配置通過 sssd 的授權。
使用 PowerShell 腳本新增所需的屬性。
新增sshPublicKeyAttribute.ps1函數新屬性ID {
$字首=“1.2.840.113556.1.8000.2554”
$GUID=[System.Guid]::NewGuid().ToString()
$零件=@()
$Parts+=[UInt64]::Parse($guid.SubString(0,4),“AllowHexSpecifier”)
$Parts+=[UInt64]::Parse($guid.SubString(4,4),“AllowHexSpecifier”)
$Parts+=[UInt64]::Parse($guid.SubString(9,4),“AllowHexSpecifier”)
$Parts+=[UInt64]::Parse($guid.SubString(14,4),“AllowHexSpecifier”)
$Parts+=[UInt64]::Parse($guid.SubString(19,4),“AllowHexSpecifier”)
$Parts+=[UInt64]::Parse($guid.SubString(24,6),“AllowHexSpecifier”)
$Parts+=[UInt64]::Parse($guid.SubString(30,6),“AllowHexSpecifier”)
$oid=[String]::Format(«{0}.{1}.{2}.{3}.{4}.{5}.{6}.{7}»,$prefix,$Parts[0],
$Parts[1],$Parts[2],$Parts[3],$Parts[4],$Parts[5],$Parts[6])
$oid
}
$schemaPath = (Get-ADRootDSE).schemaNamingContext
$oid = 新屬性ID
$屬性=@{
lDAPDisplayName = 'sshPublicKey';
屬性ID = $oid;
oMSyntax = 22;
屬性語法 = "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"'
$用戶模式| Set-ADObject -Add @{mayContain = 'sshPublicKey'}

新增屬性後,必須重新啟動 Active Directory 網域服務。
讓我們繼續討論 Active Directory 使用者。 我們將使用您方便的任何方法產生用於 ssh 連線的金鑰對。
我們啟動 PuttyGen,按下「產生」按鈕,然後在空白區域內瘋狂移動滑鼠。
過程完成後,我們可以保存公鑰和私鑰,將公鑰上傳到Active Directory用戶屬性並享受流程。 但是,公鑰必須從“用於貼上到 OpenSSHauthorized_keys 檔案中的公鑰:“。
國際大賽SSH和sudo的得獎者再次登上舞台。 由傑出的 Active Directory 指揮領導
將密鑰新增至使用者屬性。
選項 1 - 圖形使用者介面:
國際大賽SSH和sudo的得獎者再次登上舞台。 由傑出的 Active Directory 指揮領導
選項 2 - PowerShell:
get-aduser user1 | set-aduser -add @{sshPublicKey = 'AAAAB...XAVnX9ZRJJ0p/Q=='}
因此,我們目前擁有:一個填寫了 sshPublicKey 屬性的用戶,一個配置好的 Putty 用戶端,用於使用金鑰進行授權。 還有一個小問題:如何強制 sshd 守護程式從使用者的屬性中提取我們需要的公鑰。 在資產階級互聯網上找到的一個小腳本可以成功地解決這個問題。

cat /usr/local/bin/fetchSSHKeysFromLDAP
#!/bin/sh
ldapsearch -h testmdt.testopf.local -xb "dc=testopf,dc=local" '(sAMAccountName='"${1%@*}"')' -D [email protected] -w superSecretPassword 'sshPublicKey' | sed -n '/^ /{H;d};/sshPublicKey:/x;$g;s/n *//g;s/sshPublicKey: //gp'

我們將其權限設定為 root 0500。

chmod 0500  /usr/local/bin/fetchSSHKeysFromLDAP

在本例中,使用管理員帳戶綁定到目錄。 在戰鬥條件下,必須有一個具有最低權限的單獨帳戶。
儘管設定了權限,但我個人對腳本中純形式的密碼感到非常困惑。
解決方案選項:

  • 我將密碼保存在單獨的文件中:
    echo -n Supersecretpassword > /usr/local/etc/secretpass

  • 我將 root 的檔案權限設定為 0500
    chmod 0500 /usr/local/etc/secretpass

  • 變更 ldapsearch 啟動參數:參數 -w 超秘密密碼 我把它改為 -y /usr/local/etc/secretpass

今天套件中的最後一個和弦是編輯 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 群組中的成員身分來執行的。
指揮棒最後一揮,大廳陷入肅靜。

書面使用的資源:

透過 Active Directory 執行 Sudo
透過 Active Directory 的 SSH 金鑰
Powershell 腳本,為 Active Directory 架構新增屬性
sudo 穩定版本

來源: www.habr.com

添加評論