簡體   English   中英

如何在不使用sudoers nopasswd選項的情況下將BASH腳本自動提升到遠程服務器上的root用戶?

[英]How can a BASH script automatically elevate to root on a remote server, without using sudoers nopasswd option?

哦!

也許您可以幫助我。 我找不到特定問題的答案,因為有一個明顯的解決方案,不允許使用。 但首先要考慮的是上下文:

在我的公司(一家服務提供商)中,我們管理一堆Linux服務器。 我的一些同事很長時間以來一直在從源服務器運行BASH腳本,然后在許多遠程Linux服務器上通過SSH執行某些任務。 它執行的任務必須以root用戶身份執行,因此腳本要做的是,它通過SSH將源服務器授權為遠程Linux服務器上的root用戶(遠程服務器具有源服務器公共SSH密鑰)。 然后發生的是實施了新的安全策略,現在拒絕了通過SSH的root登錄。 因此,上述方法不再有效。

我一直在尋找的解決方案(根據政策,我們不允許這樣做)是在sudoers文件中創建一個條目,允許sudo無需特定用戶的密碼即可root用戶。 這是條款,他們必須遵守。 唯一允許的過程是使用您的個人用戶登錄到目標服務器,然后將sudo su-設置為root WITH password。 我說的很像Cocky,我說:“應該可以讓腳本自動執行此操作”,而管理就像“ Cool,然后就執行!” 現在我在Stack Overflow,因為我知道這是個聰明的人。

因此,這正是我要使用BASH腳本執行的操作,並且我不知道它是否可行或如何完成,我真的希望您能為我提供幫助:

想象鮑勃,他已經登錄到源服務器,並且他想針對目標服務器執行腳本。 知道基於SSH的根目錄不起作用,因此腳本的授權部分已升級。 Bob運行腳本時,會提示他輸入密碼。 然后將密碼存儲在一個變量中(加密后會很棒),然后腳本以其用戶身份登錄(允許)登錄目標服務器,然后使用他在源代碼中輸入的密碼自動將其提升為root用戶。服務器。 現在,該腳本已成為root用戶,並且可以照常運行其任務。

自動通過SSH提升

可以用BASH完成嗎? 如何?

更新:

劇本:

    ## define code to be run on the remote system
remote_script='sudo -S hostname'

## local system

# on the local machine: prompt the user for the password
read -r -p "Enter password for $host: " password

# ...and write the password, followed by a NUL delimiter, to stdin of ssh
ssh -t 10.0.1.40 "$remote_script" < <(printf '%s\0' "$password")

錯誤:

    [worker@source ~]$ sh elevate.sh 
Enter password for : abc123
elevate.sh: line 10: syntax error near unexpected token `<'
elevate.sh: line 10: `ssh -t 10.0.1.40 "$remote_script" < <(printf '%s\0' "$password")'

第一:因為它將明文密碼公開給遠程系統(攻擊者可以使用stracesysdig等診斷工具在其中讀取sysdig ),因此,與在sudoers正確使用NOPASSWD:標志相比,此方法的安全性較差 如果您的安全團隊不是絕對的白痴,他們會批准免除政策(也許有一些適當的控制措施,例如擁有一個專用帳戶,該帳戶有權訪問特定於正在運行的命令的setuid二進制文件,並對該帳戶執行身份驗證通過帶有已存儲的加密的私鑰的公共密鑰身份驗證),而不是批准使用此黑客。

第二:這是您的技巧。

## define code to be run on the remote system
remote_script='sudo -S remote_command_here'

## local system

# on the local machine: prompt the user for the password    
read -r -p "Enter password for $host: " password

# ...and write the password, followed by a NUL delimiter, to stdin of ssh
ssh "$host" "$remote_script" < <(printf '%s\0' "$password")

好吧,這不是最終的答案,但我想在CharlesDuffy的大力幫助下,我已經接近了。

到目前為止,我可以在已經具有源服務器公鑰的遠程服務器上運行腳本而不會出現錯誤。 但是,我執行的命令不會像在遠程系統上告訴的那樣創建文件。

但是,腳本似乎正在運行,並且密碼似乎已被遠程系統接受。

另外,我還必須在遠程主機上的sudoers中將“ Defaults requiretty”行更改為“ Defaults!requiretty”,否則它將告訴我我需要一個TTY來運行sudo。

#!/bin/bash

## define code to be run on the remote system
remote_script='sudo -S touch /elevatedfile'

## local system

# on the local machine: prompt the user for the password
read -r -p "Enter password for $host: " password

# ...and write the password, followed by a NUL delimiter, to stdin of ssh
ssh -T 10.0.1.40 "$remote_script" < <(printf '%s\0' "$password")

更新:當我在遠程主機上拖尾/ var / log / secure時,執行腳本后,我得到以下信息,這似乎是密碼未被接受。

May 11 20:15:20 target sudo: pam_unix(sudo:auth): conversation failed
May 11 20:15:20 target sudo: pam_unix(sudo:auth): auth could not identify password for [worker]
May 11 20:15:20 target sshd[3634]: Received disconnect from 10.0.1.39: 11: disconnected by user
May 11 20:15:20 target sshd[3631]: pam_unix(sshd:session): session closed for user worker

我在源服務器上看到的啟動腳本的內容:

[worker@source ~]$ bash elevate.sh 
Enter password for : abc123
[sudo] password for worker: 
[worker@source ~]$

只需使一個守護程序或cron腳本以root身份運行,這將依次檢查指定安全位置中的任何新腳本(即,它僅具有READ訪問權限的DB),並且如果存在,它將下載並執行它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM