3000+ Solaris, AIX ve Linux sunucularında root şifresini değiştirmenin en iyi yolu nedir?


12

Uzun lafın kısası: Büyük eski şirket, birçok UNIX / Linux sunucusu.

Birkaç yıl önce bırakılan bir sürü senaryo için sorumluluğu devraldım. Bunlardan biri, tüm sunucularımızda kök parolayı global olarak güncellemek için her X $ ayda bir çalıştırılacak bir komut dosyasıydı.

Komut dosyası, Kabuk Betiği ve Beklentinin bir karmaşasıdır ve tüm sunucularımız ile merkezi bir komut ve kontrol sunucusu arasında ayarlanan SSH güveninde çalışır.

Sorun şu ki, senaryo dev bir karmaşa. Expect komutları, orada herhangi bir UNIX / Linux kutusunda bulunan her olası "passwd" sürümünü hesaba katmaya çalışıyor ve bunlar biraz farklı.

Altyapımızın çoğunu genişletip geliştirirken, komut dosyası gerçekten yönetilemez hale geliyor.

Sorum şu: Bunu yapmanın daha iyi bir yolu var mı? Önceden kurulmuş bir SSH güveni olduğu varsayılarak, aynı anda 3000'den fazla sunucuda kök parolayı değiştirmenin en iyi yolu nedir?


2
sudoKök şifreleri tamamen kullanmak ve kaldırmak bir seçenek değil, değil mi?
Dmitri Chubarov

5
Stajyer mi kiraladınız? :)
EEAA

1
@DmitriChubarov "sudo" kullanan bir parolayı korumak (ve değiştirmek) için farklı bir hesaba sahip olmak anlamına gelir - peki nokta nerede?
wabbit

1
@ syneticon-dj Diğer hesaplar yeniden oluşturulabilir ve daha iyi desteklenen her ne olursa olsun LDAP veya NIS gibi merkezi olarak tutulan bir veritabanında saklanabilir. Yerel kökü söküp ldap'tan gelen ile değiştirmekle aynı şey değildir.
Dmitri Chubarov

2
3 binden fazla makineniz varsa, yönetim araçlarına ihtiyacınız var ... dün!
warren

Yanıtlar:


17

Kukla kullanın .

Kukla çok esnektir, bakımı kolaydır ve SSL kullanır. Kulağa biraz fazla gelebilir ve Kukla sistemini kurmak için biraz çaba harcamanız gerekir.

Fakat. Büyük olasılıkla bu, bu makinelerde yapacağınız son toplu güncelleme değildir. Kukla, toplu güncelleme prosedürü ne zaman başlarsa başlasın ve komut dosyaları çok okunabilir / tekrar kullanılabilir olduğunda size çok fazla zaman kazandırır.

En azından bu benim için birkaç yıl önce çalıştı ve yine de o Kukla tariflerinin (aka betikler) bazılarını tekrar kullanabiliyorum. Biraz daha küçük ortamlarda da kullandım, sadece her makinenin gerçekten bilinen bir duruma sahip olduğundan emin olun .

Bir çok kez (birçok şirkette) tüm özelleştirilmiş dağıtım komut dosyalarının bir süre sonra veya bir sonraki adam içeri girdiğinde popoda ağrı haline geldiğini kanıtladım. Ve bir cep telefonu taşıdığınız sürece, eski komut dosyaları size musallat olur.

Bunun gerçekten kulağa hoş geldiğini düşünüyorsanız, başlamanız için sanal ortama sahip harika bir Kukla öğreticisi .


4
Agred ama yok değil bir kullanmak user{"root":}şifre belirleyin. Bunun yerine, exec{"chpasswd -e ..."}çok daha güvenli bir an kullanın .
Dennis Kaarsemaker

7
Lütfen cevabınızı düzeltin, kukla SSH değil SSL kullanıyor. Geri kalanıyla aynı fikirde olun , ancak ansible , bu kullanım durumu için çok daha uygun hafif bir alternatif gibi görünüyor. Sadece pip install ansiblebir GNU / Linux kutusunda, bir ana bilgisayar listesi oluşturun ansible -m user -a "password=$crpyt". Hiçbir ajan gerekmez. GNU / Linux, AIX ve Solaris'i kutusundan çıkarır.
dawud

Doğru SSH değil SSL kullanıyor. Kuklacı'nın SSH aracılığıyla bir istemci uzunluğunda öykü kısa çalışmasıyla kullanıldığı bir sistemde sürdürüyorum. Yanıt düzeltildi. Teşekkürler bunu işaret!
tomi

Aşağıda kendi cevabımı verdim, ancak muhtemelen sizin için en "doğru" ve yönetilebilir uzun vadeli çözüm olduğu için sizinkini kabul ediyorum. Bununla birlikte, kuklayı büyüklüğümüzde bir ortamda ortaya çıkarmak için altyapı, planlama, lisanslama ve zaman açısından önemli bir yatırım gerektirir. Bir gün oraya
varacağız

1
@DennisKaarsemaker: Bunu bir hata olarak Kukla Laboratuvarlarına bildirmelisiniz. Bunu duymakla çok ilgilenirlerdi.
Bill Weiss

3

Solaris'te Perl modülünü Authen :: PAM'i büyük bir başarıyla kullandım. İşte örnek bir komut dosyası:

#!/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

Perl yazabiliyorsanız, Net :: OpenSSH :: Parallel modülü SSH üzerinden uzak ana bilgisayarlarda paralel olarak eylemler gerçekleştiren komut dosyaları yazmanıza izin verir.

Temel olarak kullanabileceğiniz şifreleri değiştirmek için örnek bir komut dosyası içerir . Heterojen bir ortamınız var gibi göründüğü gibi, ana bilgisayarları türe göre gruplandırmak ve her biri için farklı bir diyalog işleme alt kullanmak istiyorsunuz.


1

"En iyi" ve karışımınızdaki tüm Linux * nix makineleri için mümkün olup olmadığını bilmiyorum, ama bu tür bir aktivite için kukla veya cfengine baktınız mı?

Ayrıca kimlik yönetimi için ticari (son derece pahalı) araçlar da var, geçmişte gördüğüm / kullandığım ikisi Oracle Identity Manager ve Novel eşdeğeri.


1

Bunu araştırmaya devam ettikten sonra birkaç şey öğrendim ...

Her şeyden önce, bu, özellikle birçok farklı ortamda otomatikleştirmek için gerçekten sinir bozucu bir görevdir. Bu sorunun en doğru cevabı muhtemelen @ tomi's: Kukla kullanın.

Sonunda Kukla'nın altyapıyı yönetmesini sağlamayı umuyorum, ancak şu anda kök parola değişikliği için tüm girişimin UNIX sunucularına dağıtılması bir seçenek değil.

Birçok yönetim sayfasını ve çok sayıda Google-fu'yu okuduktan sonra, hedef sunucular listesinde dolaşan, bir SSH bağlantısı açan ve aşağıdakilerden birini çalıştıran bir komut dosyası bulmayı başardım:

# 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"

Sadece bu komutları çalıştırmaktan biraz daha fazlasını yapar, ancak yukarıdaki olanlar sihirle çalışanlardır.

Solaris'te şifreyi yinelemesiz olarak değiştirmenin basit bir yolunu bulamadım - bu yüzden /etc/shadowanında değiştirmeye başvurduk .


2
Lütfen kabuk satırına giriş yaptığı için komut satırına açık metin şifreleri koymayın. Veya kabuk geçmişini /dev/nullyapmadan önce olarak ayarlayın .
Marcin

1
evet, ayrıca komut dosyasında şifre koymayın, şifreli passwd eklemek için benim komut dosyası kontrol
Rahul Patil

1

Son zamanlarda Bash Script Kullanarak yaptım ..

#!/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

Bu benim çözümüm. hala birden fazla sistemde çalışıp çalışmadığını görmeniz gerekiyor

#!/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

Komutunuzu aynı anda birden çok ana bilgisayarda çalıştırmak için pdsh komutunu kullanabilirsiniz .


Peki hangi komutu kullanacaksın? passwdbelirtilen farklı sürümlerde farklıdır. pwher zaman mevcut değil ....
Chris S

Tüm kutularda komutları çalıştırma kısmına oldukça iyi sahibiz. Sorun parolanın gerçek değiştirilmesidir. Bildiğim kadarıyla passwd, her zaman kullanıcı etkileşimlidir.
Ricapar

passwdLinux'ta en azından bir --stdinparametresi var
AngerClown

0

Kuklaya ek olarak: SaltStack Başka bir yaklaşım - dağıtmak için fazla zaman / çaba gerektirmeyen Fabric http://docs.fabfile.org/en/1.6/ , Capistrano veya benzeri kullanarak SSH libs kullanarak ardışık veya paralel olarak yürütmeyi otomatikleştirin .


0

İki seçenek:

Kukla kullan

Çalışma güvertesi kullanın. Run deck, yüzlerce makinede aynı anda komut çalıştırmanıza izin veren bir sunucudur. Yalnızca bir makine alt kümesinde komutları yürütmek için makineleri gruplara ayırabilirsiniz.

http://rundeck.org


-2

Ben /etc/shadowlinux distros genelinde dosya formatı oldukça standart olduğunu düşünüyorum . Parolayı güncellemek için basit bir awk betiği yazabilir misiniz?

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

Kendini kilitlememek için test ettiğinden emin olurum;)


/ Etc / shadow komutunun düzenlenmesinin bir yolu olduğuna inanıyorum. Ancak, yönlendirme düzenlemeden önce / etc / shadow komutunu silmez mi? Bu ed veya ex için bir durum gibi görünüyor.
mpez0

3
Gölgenin biçimi olabilir, ancak karmaların her yerde aynı algoritma tarafından yorumlanması garanti edilmez. Ayrıca küçük betiğiniz tüm girişleri tamamen gölgeden kaldırdı. :}
17'de tink

lol oops, düzeltilmelidir. Umarım o
tink'i
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.