Cara terbaik untuk mengubah kata sandi root pada 3000+ server Solaris, AIX, dan Linux?

12

Singkat cerita: Perusahaan besar lama, banyak server UNIX / Linux.

Saya mewarisi tanggung jawab untuk banyak skrip yang tersisa beberapa tahun yang lalu. Salah satunya adalah skrip yang akan dijalankan setiap $ X jumlah bulan untuk memperbarui secara global kata sandi root di semua server kami.

Script itu berantakan dari Script dan Harapkan Shell, dan itu bekerja pada kepercayaan SSH yang diatur antara semua server kami dan server perintah-dan-kontrol pusat.

Masalahnya adalah, skripnya berantakan. Perintah Expect mencoba untuk menjelaskan setiap versi "passwd" yang mungkin ada pada kotak UNIX / Linux di luar sana - dan mereka sedikit berbeda.

Saat kami memperluas dan meningkatkan banyak infrastruktur kami, skrip menjadi sangat tidak terkelola.

Pertanyaan saya adalah: Apakah ada cara yang lebih baik untuk melakukan ini? Dengan asumsi sudah ada kepercayaan SSH yang sudah mapan, apa cara terbaik untuk mengubah kata sandi root di 3000+ server secara bersamaan?

Ricapar
sumber
2
Menggunakan sudodan menghapus kata sandi root sama sekali bukan opsi, bukan?
Dmitri Chubarov
5
Menyewa magang? :)
EEAA
1
@DmitriChubarov menggunakan "sudo" akan menyiratkan memiliki akun yang berbeda untuk menjaga (dan mengubah) kata sandi di - jadi di mana intinya?
the-wabbit
1
@ syneticon-dj akun lain dapat dibuat lagi dan disimpan pada beberapa database yang dikelola secara terpusat misalnya LDAP atau NIS apa pun yang didukung lebih baik. Ini tidak sama dengan merobek root lokal dan menggantinya dengan yang berasal dari ldap.
Dmitri Chubarov
2
Jika Anda memiliki> 3k mesin, Anda memerlukan alat manajemen ... kemarin!
warren

Jawaban:

17

Gunakan Puppet .

Wayang sangat fleksibel, mudah dirawat dan menggunakan SSL. Mungkin terdengar sedikit berlebihan dan Anda harus melakukan upaya ekstra untuk membangun sistem Wayang.

Tapi. Kemungkinan besar ini bukan pembaruan massal terakhir yang akan Anda lakukan pada mesin ini. Wayang akan dan tidak menghemat banyak waktu Anda ketika sebenarnya apa pun prosedur pembaruan massal dimulai dan skrip sangat mudah dibaca / digunakan kembali.

Setidaknya ini bekerja untuk saya beberapa tahun yang lalu dan masih saya dapat menggunakan kembali beberapa resep wayang (alias skrip). Saya juga telah menggunakannya di lingkungan yang sedikit lebih kecil hanya memastikan bahwa setiap mesin benar-benar memiliki kondisi yang diketahui .

Saya telah membuktikannya berkali-kali (di banyak perusahaan) bahwa semua skrip penempatan yang dikustomisasi menjadi susah payah setelah beberapa saat atau ketika lelaki berikutnya masuk. Dan selama Anda membawa ponsel, skrip lama akan dan memang menghantui Anda.

Jika Anda berpikir ini benar-benar terdengar bagus, inilah tutorial Wayang yang bagus dengan lingkungan virtual yang disertakan untuk membantu Anda memulai.

tomi
sumber
4
Agred, tetapi tidak menggunakan user{"root":}untuk mengatur password. Sebaliknya, gunakan exec{"chpasswd -e ..."}, yang jauh lebih aman.
Dennis Kaarsemaker
7
Harap perbaiki jawaban Anda, boneka menggunakan SSL, bukan SSH. Setuju dengan yang lain, meskipun mungkin tampak seperti alternatif ringan yang jauh lebih cocok untuk kasus penggunaan ini. Hanya pip install ansibledi kotak GNU / Linux, buat daftar host dan ansible -m user -a "password=$crpyt". Tidak diperlukan agen. Mengelola GNU / Linux, AIX dan Solaris di luar kotak.
dawud
Benar itu menggunakan SSL, bukan SSH. Saya pernah menjadi pengelola dalam sistem di mana Wayang digunakan melalui SSH dengan mengeksekusi cerita panjang klien. Jawaban dikoreksi. Terima kasih, dawud, menunjukkan itu!
tomi
Saya memberikan jawaban saya sendiri di bawah ini , tetapi saya menerima jawaban Anda, karena itu mungkin solusi jangka panjang yang paling "benar" dan dapat dikelola untuk masalah ini. Namun, hal itu membutuhkan investasi yang signifikan dalam hal infrastruktur, perencanaan, perizinan, dan waktu untuk menggelar Wayang di lingkungan kita. Suatu hari kita akan sampai di sana ...
Ricapar
1
@DennisKaarsemaker: Anda harus melaporkannya sebagai bug ke Puppet Labs. Mereka akan sangat tertarik mendengarnya.
Bill Weiss
3

Saya telah menggunakan modul Perl Authen :: PAM on Solaris dengan sukses besar. Berikut contoh skrip:

#!/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;
fortezza
sumber
2

Jika Anda dapat menulis Perl, modul Net :: OpenSSH :: Parallel memungkinkan untuk menulis skrip yang melakukan aksi secara paralel pada host jarak jauh melalui SSH dengan mudah.

Ini berisi contoh skrip untuk mengubah kata sandi yang dapat Anda gunakan sebagai basis. Karena tampaknya Anda memiliki lingkungan yang heterogen, Anda ingin mengelompokkan host berdasarkan jenis dan menggunakan sub penanganan dialog yang berbeda untuk masing-masing.

salva
sumber
1

Saya tidak tahu tentang "terbaik", dan apakah mungkin untuk semua mesin non-Linux * nix dalam campuran Anda, tetapi apakah Anda sudah melihat wayang atau cfengine untuk kegiatan semacam ini?

Ada juga alat komersial (sangat mahal) untuk manajemen identitas di luar sana, dua yang pernah saya lihat / gunakan di masa lalu adalah Oracle Identity Manager dan Novel yang setara.

Tink
sumber
1

Setelah terus meneliti ini, saya telah belajar beberapa hal ...

Pertama dan terutama, ini adalah tugas yang sangat menjengkelkan untuk diotomatisasi, terutama di banyak lingkungan yang berbeda. Jawaban yang paling benar untuk pertanyaan ini mungkin @ tomi's: use Puppet.

Akhirnya saya berharap untuk membuat Wayang mengelola infrastruktur, tetapi menyebarkan ke server UNIX seluruh perusahaan untuk perubahan kata sandi root saat ini bukan pilihan yang layak.

Setelah membaca banyak halaman manual dan banyak Google-fu, saya berhasil membuat skrip yang melingkupi daftar server target, membuka koneksi SSH, dan menjalankan salah satu dari yang berikut:

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

Itu sedikit lebih banyak daripada hanya menjalankan perintah-perintah itu, tetapi yang di atas adalah yang bekerja dengan ajaib.

Saya tidak dapat menemukan cara sederhana untuk mengubah kata sandi pada Solaris secara non-iteratif - jadi kami terpaksa memodifikasi /etc/shadowdengan cepat.

Ricapar
sumber
2
Tolong jangan menaruh kata sandi teks-bersih pada commandline, karena itu login riwayat shell. Atau atur riwayat shell /dev/nullsebelum Anda melakukannya.
Marcin
1
ya, juga jangan memasukkan kata sandi ke dalam skrip, periksa skrip saya untuk menambahkan kata sandi terenkripsi
Rahul Patil
1

Baru-baru ini saya telah melakukan ini Menggunakan Bash Script ..

#!/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 [email protected]
_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 $*
Rahul Patil
sumber
1

Ini solusi saya sejauh ini. masih perlu melihat apakah itu berfungsi pada banyak sistem

#!/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 $*
karena
sumber
0

Anda bisa menggunakan pdsh untuk menjalankan perintah pada banyak host sekaligus.

Mendongkrak
sumber
Dan perintah apa yang akan Anda jalankan? passwdberbeda pada versi berbeda yang disebutkan. pwtidak selalu tersedia ....
Chris S
Kami memiliki bagian menjalankan perintah pada semua kotak dengan cukup baik .. Masalahnya adalah perubahan kata sandi yang sebenarnya. Sejauh yang saya tahu, passwdselalu interaktif pengguna.
Ricapar
passwddi RHEL Linux setidaknya memiliki --stdinparameter
AngerClown
0

Selain boneka: SaltStack Pendekatan lain - mengotomatisasi eksekusi menggunakan SSH libs baik secara berurutan atau paralel menggunakan Fabric http://docs.fabfile.org/en/1.6/ , Capistrano atau yang serupa yang tidak memerlukan banyak waktu / upaya untuk digunakan.

Eugene
sumber
0

Dua pilihan:

Gunakan boneka

Gunakan run deck. Run deck adalah server yang memungkinkan Anda untuk mengeksekusi perintah pada ratusan mesin secara bersamaan. Anda dapat mengelompokkan mesin ke dalam grup, untuk menjalankan perintah hanya pada sebagian mesin.

http://rundeck.org

spuder
sumber
-2

Saya pikir format /etc/shadowfile cukup standar di distro linux. Bisakah Anda menulis skrip awk sederhana untuk memperbarui kata sandi.

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

Saya akan memastikan untuk mengujinya sehingga Anda tidak mengunci diri Anda;)

HaxElit
sumber
Saya percaya mengedit / etc / shadow adalah cara untuk pergi. Namun, bukankah pengalihan akan menghapus / etc / shadow sebelum edit? Ini terlihat seperti case untuk ed atau ex.
mpez0
3
Format bayangan mungkin, tetapi hash tidak dijamin ditafsirkan oleh algoritma yang sama di mana-mana. Plus skrip kecil Anda baru saja menghapus semua entri dari shadow sama sekali. :}
tink
lol oops, harus diperbaiki. Saya harap Anda tidak sudo menjalankan
nada itu