3000+ सोलारिस, एआईएक्स और लिनक्स सर्वर पर रूट पासवर्ड बदलने के बारे में जाने का सबसे अच्छा तरीका?


12

लंबी कहानी छोटी: बड़ी पुरानी निगम, बहुत सारी यूनिक्स / लिनक्स सर्वर।

मुझे कुछ समय पहले छोड़ी गई स्क्रिप्टों के एक समूह के लिए जिम्मेदारी मिली। उनमें से एक ऐसी स्क्रिप्ट थी, जो हमारे सभी सर्वरों में रूट पासवर्ड को अपडेट करने के लिए हर महीने $ X की राशि से चलाया जाएगा।

स्क्रिप्ट शेल स्क्रिप्ट और एक्सपेक्ट की गड़बड़ी है, और यह एसएसएच ट्रस्ट पर काम करता है जो हमारे सभी सर्वरों और एक केंद्रीय कमांड-एंड-कंट्रोल सर्वर के बीच स्थापित होता है।

समस्या यह है कि, स्क्रिप्ट एक विशाल गड़बड़ है। उम्मीद आदेश "पासवार्ड" के हर संभव संस्करण के लिए खाते की कोशिश कर रहे हैं जो किसी भी यूनिक्स / लिनक्स बॉक्स पर मौजूद हैं - और वे काफी भिन्न होते हैं।

जैसा कि हम अपने बुनियादी ढांचे का बहुत विस्तार और उन्नयन कर रहे हैं, स्क्रिप्ट वास्तव में असहनीय हो रही है।

मेरा सवाल है: क्या ऐसा करने का एक बेहतर तरीका है? यह मानते हुए कि पहले से ही स्थापित एसएसएच ट्रस्ट है, एक ही समय में 3000+ सर्वर पर रूट पासवर्ड बदलने का सबसे अच्छा तरीका क्या है?


2
sudoरूट पासवर्ड को पूरी तरह से उपयोग करना और समाप्त करना एक विकल्प नहीं है, क्या यह है?
दिमित्री चुबरोव

5
एक प्रशिक्षु किराया? :)
EEAA

1
@DitriChubarov "sudo" का उपयोग करते हुए एक पासवर्ड बनाए रखने (और बदलने) के लिए एक अलग खाता होगा - तो बिंदु कहां है?
वाबेट

1
@ syneticon-dj अन्य खातों को नए सिरे से बनाया जा सकता है और कुछ केंद्र बनाए गए डेटाबेस जैसे LDAP या NIS पर संग्रहीत किया जा सकता है जो बेहतर समर्थित है। यह स्थानीय जड़ को चीर कर लेप की ओर से आने वाले की जगह नहीं है।
दिमित्री चुबारोव

2
यदि आपको> 3k मशीनें मिल गई हैं, तो आपको प्रबंधन उपकरण चाहिए ... कल!
वॉरेन

जवाबों:


17

कठपुतली का प्रयोग करें ।

कठपुतली बहुत लचीला है, एसएसएल को बनाए रखने और उपयोग करने में आसान है। थोडा अधिक लग सकता है और आपको कठपुतली प्रणाली को बनाने के लिए कुछ अतिरिक्त प्रयास करने होंगे।

परंतु। संभवत: यह अंतिम सामूहिक-अपडेट नहीं है जो आप इन मशीनों के लिए कर रहे हैं। कठपुतली आपको बहुत समय बचाती है और जब भी वास्तविक जन-अद्यतन प्रक्रिया शुरू होती है और स्क्रिप्ट बहुत पठनीय / पुन: प्रयोज्य होती हैं।

कम से कम इसने मेरे लिए कुछ साल पहले काम किया था और अब भी मैं उनमें से कुछ पपेट रेसिपी (उर्फ स्क्रिप्ट) का इस्तेमाल कर पा रहा हूं। मैंने इसे थोड़े छोटे वातावरण में भी इस्तेमाल किया है, बस यह सुनिश्चित करें कि हर मशीन वास्तव में एक ज्ञात स्थिति हो

मैंने इसे कई बार (कई कंपनियों में) साबित किया है कि सभी अनुकूलित परिनियोजन स्क्रिप्ट बट में थोड़ी देर के बाद या जब वह दूसरा लड़का कदम रखता है, तब तक दर्द हो जाता है। और जब तक आप एक सेलफोन, पुरानी स्क्रिप्ट को ले जाते हैं और आपको परेशान करते हैं।

अगर आपको लगता है कि यह वास्तव में अच्छा लगता है, तो यहां एक बढ़िया कठपुतली ट्यूटोरियल है जिसमें आभासी वातावरण शामिल है जिसे आपने शुरू किया है।


4
वृद्ध, लेकिन पासवर्ड सेट करने के लिए एक का उपयोग करें user{"root":}। इसके बजाय, एक का उपयोग करें exec{"chpasswd -e ..."}, जो अधिक सुरक्षित है।
डेनिस कारसेमेकर

7
कृपया अपना उत्तर सही करें, कठपुतली एसएसएल का उपयोग करता है, एसएसएच का नहीं। बाकी के साथ सहमत हैं, हालांकि इस उपयोग के मामले के लिए ansible एक हल्के विकल्प की तरह लगता है जो बहुत बेहतर अनुकूल है। बस pip install ansibleएक GNU / Linux बॉक्स में, मेजबान और की एक सूची बनाएँ ansible -m user -a "password=$crpyt"। किसी एजेंट की जरूरत नहीं। GNU / Linux, AIX और Solaris को बॉक्स से बाहर प्रबंधित करता है।
दाउद

सही है कि यह एसएसएल का उपयोग करता है, एसएसएच का नहीं। मैं एक ऐसी प्रणाली में अनुरक्षक होने का उपयोग करता हूं जहां कठपुतली का उपयोग एसएसएच के माध्यम से एक ग्राहक को निष्पादित करके किया जाता है - लंबी कहानी छोटी। उत्तर सही किया गया। धन्यवाद दाऊद ने कहा कि बाहर!
Tomi

मैंने अपना जवाब नीचे दिया , लेकिन मैं आपका स्वीकार कर रहा हूं, क्योंकि यह संभवतः समस्या का सबसे "सही" और प्रबंधनीय दीर्घकालिक समाधान है। हालाँकि, यह एक वातावरण में पपेट को बाहर निकालने के लिए बुनियादी ढाँचे, योजना, लाइसेंस और समय के संदर्भ में एक महत्वपूर्ण निवेश की आवश्यकता है। किसी दिन हम वहाँ
पहुँचेंगे

1
@ डेनिसकेर्सेमेकर: आपको पपेट लैब्स को बग के रूप में रिपोर्ट करना चाहिए। वे इसे सुनने के लिए सुपर इच्छुक होंगे।
बिल वीस

3

मैंने बड़ी सफलता के साथ पेर्ल मॉड्यूल ऑटेन :: पैम ऑन सोलारिस का उपयोग किया है। यहाँ एक नमूना स्क्रिप्ट है:

#!/usr/bin/perl

use Authen::PAM;

my $username = 'root';
my $password = '1234567';

die qq{Error: Unknown user\n} unless getpwnam($username);

die qq{Error: You must run this as root.\n} unless ($> == 0);

my $pamh;

sub my_conv_func
{
    my @res;
    while ( @_ )
    {
        my $code = shift;
        my $msg = shift;
        my $ans = "";

        if ($code == PAM_PROMPT_ECHO_OFF() )
        {
            if (($msg =~ /^New Password:/i) or ($msg =~ /^Re-enter new Password:/i))
            {
                $ans = $password;
            }
            else
            {
                die qq{Unknown message: $msg\n};
            }
        }
        else
        {
            print qq{$msg\n};
        }

        push @res, (PAM_SUCCESS(), $ans);
    }
    push @res, PAM_SUCCESS();

    return @res;
}

ref($pamh = new Authen::PAM("passwd", $username, \&my_conv_func)) || die "Error code $pamh during PAM init!";

my $res = $pamh->pam_chauthtok;

print $pamh->pam_strerror($res),"\n" unless $res == PAM_SUCCESS();

exit 0;

2

यदि आप पर्ल लिख सकते हैं, तो मॉड्यूल नेट :: ओपनएसएसएच :: समानांतर उन स्क्रिप्ट को लिखने की अनुमति देता है जो एसएसएच के माध्यम से दूरस्थ मेजबान पर समानांतर रूप से कार्रवाई करते हैं।

इसमें पासवर्ड बदलने के लिए एक नमूना स्क्रिप्ट शामिल है जिसे आप आधार के रूप में उपयोग कर सकते हैं। जैसा कि ऐसा लगता है कि आपके पास एक विषम वातावरण है, आप मेजबानों को प्रकार से समूहित करना चाहेंगे और हर एक के लिए एक अलग संवाद हैंडलिंग उप का उपयोग करेंगे।


1

मुझे "सर्वश्रेष्ठ" के बारे में नहीं पता है, और क्या यह आपके मिश्रण में सभी गैर-लिनक्स * निक्स मशीनों के लिए संभव है, लेकिन क्या आपने इस तरह की गतिविधि के लिए कठपुतली या कोफ़ेंगिन देखा है?

पहचान प्रबंधन के लिए वाणिज्यिक (अत्यधिक महंगे) उपकरण भी हैं, दो जो मैंने अतीत में देखे / उपयोग किए हैं वे ओरेकल आइडेंटिटी मैनेजर और नॉवेल समतुल्य हैं।


1

इसे जारी रखने के बाद, मैंने कुछ चीजें सीखी हैं ...

सबसे पहले और सबसे महत्वपूर्ण, यह स्वचालित रूप से कष्टप्रद कार्य है, विशेष रूप से कई अलग-अलग वातावरणों में। इस प्रश्न का सबसे सही उत्तर शायद @ tomi's है: कठपुतली का उपयोग करें।

आखिरकार मुझे बुनियादी ढाँचे का प्रबंधन करने के लिए कठपुतली मिलने की उम्मीद है, लेकिन अभी पूरे उद्यम के यूनिक्स सर्वरों को रूट पासवर्ड बदलने के लिए तैनात करना एक विकल्प के रूप में संभव नहीं है।

कई मैनपेज़ और बहुत सारे Google-फू को पढ़ने के बाद, मैं एक स्क्रिप्ट के साथ आने में कामयाब रहा, जो लक्ष्य सर्वर की सूची के माध्यम से लूप करता है, एक SSH कनेक्शन खोलता है, और निम्न में से एक चलाता है:

# Solaris
# Generate new pass via crypt(newpass,salt) and insert it into /etc/shadow

# AIX
$ echo "root:newpass" | chpasswd -f NOCHECK

# Linux
$ echo "newpass" | passwd root --stdin

# IBM VIO (Virtual I/O)
$ echo "echo \"padmin:newpass\" | chpasswd -f NOCHECK" | oem_setup_env

# IBM HMCs (Hardware Management Consoles)
$ chhmcusr -u hscroot -t passwd -v "newpass"

यह उन आदेशों को चलाने की तुलना में थोड़ा अधिक करता है, लेकिन ऊपर जो काम करते हैं वह जादू है।

मैं सोलारिस पर पासवर्ड को गैर-पुनरावृत्तीय रूप से बदलने का कोई सरल तरीका नहीं खोज सका - इसलिए हमने /etc/shadowमक्खी पर संशोधन का सहारा लिया ।


2
कृपया कमांडलाइन पर क्लीयरटेक्स्ट पासवर्ड न डालें, क्योंकि यह शेल हिस्ट्री में लॉग इन हो जाता है। या शैल इतिहास सेट करने /dev/nullसे पहले इसे करें।
मार्सिन

1
हां, स्क्रिप्ट में पासवर्ड भी न डालें, एन्क्रिप्टेड पास को जोड़ने के लिए मेरी स्क्रिप्ट की जांच करें
राहुल पाटिल

1

हाल ही में मैंने यह प्रयोग करके बैश स्क्रिप्ट का निर्माण किया है।

#!/usr/bin/env bash

# Change Password of Remote Server Using SSH

#--------------------------------------------
# Define User which you want to
# Change Password in remote server
#--------------------------------------------
Uname="root"
# Create Password in Encrpyted Form Using below command,
# and store in this script
# perl -e'print crypt("YourPassword", "salt")' ; echo -e
# then copy and past in following varible,
# password should be single qouted*

Password='safv8d8ESMmWk'

Update_Pass() {
  ssh $ruser@$Server_ip  -p $port "echo ${Uname}:${Password} | chpasswd -e"
}

Show_Help(){
cat <<_EOF
Usage $0        [OPTION]..
Mandatory arguments to long options are mandatory for short options too.
  -i, --ip     <IP_ADDR_OF_SREVER> IP Address Of Remote Server
  -u, --user   <Username>          Username Of Remote Server    <Default User is root>
  -p, --port   <port>              Port Of Remote Server        <Default is 22>

Note:- For Security Reason Do Not Provide Password to the script, because
       it will get save in history, so do not provide it,
       script will prompt for password

Report $0 bugs to loginrahul90@gmail.com
_EOF
}



Main() {

        case $1 in
           -i|--ip) Server_ip=$2;
                    ruser="$4"; [[ -z $ruser ]] && ruser=root
                    port="$6";  [[ -z $port  ]]  && port=22
                    Update_Pass ;;
                *)  Show_Help ;;
        esac
}

Main $*

1

यह मेरा अब तक का समाधान है। अभी भी यह देखने की जरूरत है कि क्या यह कई प्रणालियों पर काम करता है

#!/usr/bin/env bash

ChangePassword()
{
    echo "changing password for server $ServerIp"
    ssh root@$ServerIp "echo root:${NewPassword} | chpasswd" < /dev/null
}

CreatePassword()
{
    while true;
    do
        echo "Please enter the new password :"
        read -s NewPassword <&0
        echo "Confirm the password :"
        read -s ConfirmPassword <&0 
        # /proc/${PPID}/fd/0

        if [ "$NewPassword" == "$ConfirmPassword" ]
        then
            break
        else
            echo "Passwords do not match"
            echo "Try again..."
        fi
    done
    ChangePassword
    echo "end of createpassword"
}

SetUpPasswordlessSSH()
{   
    echo "enter the old password from server $ServerIp when asked"
    ssh root@$ServerIp mkdir -p .ssh
    cat .ssh/id_rsa.pub | ssh root@$ServerIp 'cat >> .ssh/authorized_keys'

    echo "Passwordless SSH is now available"
    echo "Now you can change the password"
    CreatePassword
}

NoSSH()
{
    echo "Passwordless SSH for this server with ip $ServerIp is not yet set up."
    read -p "Do you want to set it up now? " -n 1 -r <&0
    echo "" 
    if [[ ! $REPLY =~ ^[Yy]$ ]]
    then
        break
    else
        SetUpPasswordlessSSH
    fi
}

AcceptHostKey()
{
    read -p "Do you trust the server? " -n 1 -r <&1 
    echo ""
    if [[ ! $REPLY =~ ^[Yy]$ ]]
    then
        break
    else
        SetUpPasswordlessSSH
    fi
}

Main()
{
    while read -r ServerIp <&9
    do
        echo  "Server $ServerIp ..."
        status=$(ssh -o BatchMode=yes -o ConnectTimeout=5 $ServerIp echo ok 2>&1)
        if [[ $status == ok ]]
        then
            echo "creating password"
            CreatePassword
            echo "password changed"
        elif [[ $status == "Permission denied"* ]]
        then
            NoSSH
        elif [[ $status == "Host key verification failed"* ]]
        then
            echo "Error: $status"
            AcceptHostKey
        else
            echo "ERROR OCCURED FOR SERVER WITH IP: $ServerIp"
            echo "Error: $status"
        fi
    done 9< servers.txt
    history -cw
    clear
}

Main $*

0

आप एक ही समय में कई मेजबानों पर अपनी कमांड निष्पादित करने के लिए pdsh का उपयोग कर सकते हैं ।


और आप कौन सी कमांड चलाने जा रहे हैं? passwdउल्लिखित विभिन्न संस्करणों पर अलग है। pwहमेशा उपलब्ध नहीं ....
क्रिस एस

हमारे पास सभी बॉक्स पर बहुत अच्छी तरह से कमांड चलाने का हिस्सा है। समस्या पासवर्ड के वास्तविक परिवर्तन की है। जहाँ तक मुझे पता है, passwdहमेशा उपयोगकर्ता-इंटरैक्टिव है।
रिकापार

passwdRHEL Linux पर कम से कम एक --stdinपैरामीटर है
AngerClown

0

कठपुतली के अलावा: साल्टस्टैक एक अन्य दृष्टिकोण - एसएसएच काम का उपयोग करके या तो स्वचालित रूप से या समानांतर में फैब्रिक http://docs.fabfile.org/en/1.6/ , कैपिस्ट्रानो या इसी तरह का उपयोग करते हुए निष्पादन को स्वचालित करें या तैनात करने के लिए बहुत अधिक प्रयास की आवश्यकता नहीं है।


0

दो विकल्प:

कठपुतली का प्रयोग करें

रन डेक का उपयोग करें। रन डेक एक सर्वर है जो आपको एक साथ सैकड़ों मशीनों पर कमांड निष्पादित करने की अनुमति देता है। आप मशीनों के एक सबसेट पर कमांड निष्पादित करने के लिए, मशीनों को समूह में समूहित कर सकते हैं।

http://rundeck.org


-2

मुझे लगता है कि /etc/shadowफाइल का प्रारूप लिनक्स डिस्ट्रोस के पार काफी मानक है। क्या आप केवल पासवर्ड को अपडेट करने के लिए एक साधारण awk स्क्रिप्ट लिख सकते हैं।

cat /etc/shadow| awk -v pass='NEWPASSHASH' -v now=`date '+%s'` 'BEGIN{ OFS=FS=":"} /^root/ {$2=pass; $3=now} {print}' > /tmp/shadow && mv /tmp/shadow /etc/shadow

मैं यह सुनिश्चित करने के लिए परीक्षण करूँगा ताकि आप अपना स्वयं का ताला बंद न करें;)


मेरा मानना ​​है कि संपादन / आदि / छाया रास्ता तय करना है। हालांकि, संपादन से पहले अनुप्रेषित / आदि / छाया को मिटा नहीं पाएंगे? यह एड या पूर्व के लिए एक मामले की तरह दिखता है।
mpez0

3
छाया का प्रारूप हो सकता है, लेकिन हैश की हर जगह एक ही एल्गोरिदम द्वारा व्याख्या किए जाने की गारंटी नहीं है। साथ ही आपकी छोटी लिपि ने छाया से सभी प्रविष्टियों को पूरी तरह से हटा दिया। :}
tink

लोल उफ़, तय किया जाना चाहिए। मुझे आशा है कि आपने उस
टिंकू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.