GNU/Linux >> Belajar Linux >  >> Linux

Sinkronisasi satu arah sederhana dari daftar kata sandi pengguna antar server

Solusi 1:

Anda dapat menggunakan awk untuk mengekstrak pengguna/grup dengan ID 500 atau lebih. Saya juga mengambil kebebasan untuk mengecualikan id pengguna 65534, yang sering dicadangkan untuk pengguna "bukan siapa-siapa" (bergantung pada distro; tidak ada petunjuk jika CentOS melakukannya):

awk -F: '($3>=500) && ($3!=65534)' /etc/passwd > passwd.new
awk -F: '($3>=500) && ($3!=65534)' /etc/group > group.new
awk -F: '($3>=500) && ($3!=65534) {print $1}' /etc/passwd | grep -f - /etc/shadow > shadow.new

Kemudian gunakan rsync, scp, atau metode transmisi file pilihan Anda untuk menyalin file ke sistem cadangan Anda. File-file ini kemudian dapat ditambahkan ke akhir file passwd, grup atau bayangan 'bersih' ketika Anda perlu memulihkannya (yaitu:hanya pengguna/grup sistem default, untuk mencegah duplikasi ID/nama pengguna yang tidak disengaja).

cat passwd.new >> /etc/passwd
cat group.new >> /etc/group
cat shadow.new >> /etc/shadow

Solusi 2:

NIS/NIS+ diciptakan untuk alasan yang tepat ini.

Tapi otentikasi mereka agak jelek dan terpusat (LDAP/Kerberos/SMB/dll.) adalah ide yang jauh lebih baik jika Anda bisa melakukannya. Untuk mengatur NIS/NIS+ Anda memerlukan:

Paket:

yp-tools ypbind ypserv portmap

dan /etc/yp.conf dengan sesuatu seperti:

domain example.org server nis.example.org
ypserver nis.example.org

dan kemudian di /etc/sysconfig/network:

NISDOMAIN=example.org

Dan saya malas, inilah cara yang bagus:http://www.wains.be/index.php/2007/02/28/setting-up-nis-under-centos-4/ yang akan memandu Anda melewatinya.

Secara pribadi untuk pencadangan, saya baru saja mencadangkan seluruh direktori /etc/ dan menyelesaikannya. Paling banyak hanya beberapa MB.

Solusi 3:

gunakan cppw dan cpgr:

CPPW(8)                                                                                                                                                      

NAME
       cppw, cpgr - copy with locking the given file to the 
       password or group file

SYNOPSIS<br>
       cppw [-h] [-s] password_file
       cpgr [-h] [-s] group_file

DESCRIPTION
       cppw  and  cpgr will copy, with locking, the given file to
       /etc/passwd and /etc/group, respectively.  With the -s flag, 
       they will copy the shadow versions of those files, 
       /etc/shadow and /etc/gshadow, respectively.

       With the -h flag, the commands display a short help message
       and exit silently.

SEE ALSO
       vipw(8), vigr(8), group(5), passwd(5), shadow(5), gshadow(5)

AUTHOR
       cppw and cpgr were written by Stephen Frost, based on vipw 
       and vigr written by Guy Maor.

Solusi 4:

Ada banyak cara dan solusi di sini, tetapi untuk menjawab pertanyaan awal ada tiga langkah:

  1. Buat kunci SSH tanpa kata sandi di server:

    ssh-keygen -b 4096

  2. Salin .ssh/id_rsa.pub ke .ssh/authorized__keys2 di klien:

    scp ~/.ssh/id_rsa.pub client:.ssh/authorized_keys2

  3. Tambahkan sesuatu seperti ini ke /etc/crontab Anda (atau edit dengan crontab -e):

    0 0 * * * scp /etc/{passwd,shadow,group} [email protected]:/var/mybackupdir

Solusi 5:

Yah, saya pikir ada sesuatu yang bisa saya gunakan tanpa harus menggulirkan solusi saya sendiri, tetapi saya harus melakukan sesuatu dengan cepat.

Di bawah ini adalah skrip yang akan melakukan apa yang saya butuhkan.

Petunjuk

Agar berfungsi, cukup ubah beberapa variabel konfigurasi agar UID minimum dan maksimum dianggap sebagai normal pengguna dan nama host jarak jauh atau alamat IP.

Anda harus menyiapkan server jarak jauh untuk menerima sesi SSH yang masuk dari root server lokal pengguna tanpa harus memasukkan kata sandi.
Komandan Keen mengisyaratkan bagaimana hal itu dilakukan dalam jawabannya di halaman ini, tetapi Anda juga dapat merujuk ke login SSH tanpa kata sandi untuk petunjuk mendetail.

Cara kerjanya

Yang dilakukan skrip adalah menyalin setiap passwd jarak jauh , grup , bayangan , bayangan file dari server jarak jauh ke lokasi sementara di server lcoal.
Kemudian menghapus file temp ini dari semua pengguna "normal", hanya menyimpan referensi ke pengguna sistem.

Langkah selanjutnya adalah menelusuri setiap passwd versi lokal , grup , bayangan , bayangan dan hanya menambahkan pengguna "normal" ke file temp yang sesuai, lalu mengunggah masing-masing kembali ke server jarak jauh untuk menggantikan yang lama.

Peringatan

Sebelum mencoba apa pun, pastikan Anda membuat salinan passwd Anda , grup , bayangan , bayangan di server lokal dan jarak jauh.

Keamanan

Kepemilikan dan atribut file dipertahankan.
File sementara disimpan di /tmp dan dihapus, apakah sinkronisasi berhasil atau tidak.
Server lokal harus memiliki root tanpa kata sandi akses ke cadangan (tetapi bukan sebaliknya). Ini diperlukan agar kami bisa mendapatkan file konfigurasi akun pengguna (yang jika tidak dibatasi).

Kode

Ini adalah upaya pertama dan agak berantakan (bukan kode yang bagus) tetapi berfungsi dengan baik dan orang lain mungkin menganggapnya berguna.

Ini adalah skrip Perl yang hanya bergantung pada Net::SCP modul untuk menyalin file dengan aman antar server.

#!/usr/bin/perl -w
use Net::SCP qw(scp);
use strict;

use constant TRUE  => (1==1);
use constant FALSE => (1==0);

#--------------------------------------------------------
# Configuration
# Modify as needed
#--------------------------------------------------------
my $remoteHost = '10.13.113.2';  # email backup server
my $minUID     = 500;
my $maxUID     = 30000;
my $minGID     = 500;
my $maxGID     = 30000;

#--------------------------------------------------------
# Internal variables, normally not to be modified.
#--------------------------------------------------------
my $systemConfigDir = '/etc';
my $tmpDir = $ENV{TMPDIR} || $ENV{TMP} || $ENV{TEMP} || '/tmp';

#--------------------------------------------------------
#  Main
#--------------------------------------------------------
# STEP 1
# Get the remote files to /tmp and
# clean them of their normal users
ProcessFiles('remote');

# STEP 2
# Append the local normal users to the temp files
# and then send them back to the remote
ProcessFiles('local');

#--------------------------------------------------------
# ProcessFiles sub does one of two things:
# - if the passed argument is 'remote', then fetch each
#   user account file from the remote server, then remove
#   all normal users from each file, only keeping the
#   system users.
# - if the passed argument is 'local', then appends all
#   normal local users to the previously fetched and
#   cleaned-up files, then copies them back to the remote.
#--------------------------------------------------------
sub ProcessFiles {
        my $which = shift;
        my $tmpfile;
        my %username = ();
        my %usergroup = ();
        my %userUID = ();
        my %userGID = ();
        my @info;
        foreach my $f ('passwd','group','shadow','gshadow') {
                my $tmpfile = "$tmpDir/$f.REMOTE";
                if ($which eq 'remote') {
                        # Fetch the remote file
                        unlink $tmpfile if -e $tmpfile;
                        scp("$remoteHost:$systemConfigDir/$f", $tmpfile)
                                or die ("Could not get '$f' from '$remoteHost'");
                }
                # Glob the file content
                open CONFIGFILE, (($which eq 'remote') ? $tmpfile : "$systemConfigDir/$f");
                my @lines = <CONFIGFILE>;
                close CONFIGFILE;
                # Open the temp file, either truncating it or in append mode
                open TMPFILE,  (($which eq 'remote') ? ">$tmpfile" : ">>$tmpfile" )
                        or die "Could not open '$tmpfile' for processing";
                foreach my $line (@lines) {
                         # Skip comments, although they should be illegal in these files
                        next if $f =~ /^\s*#/;
                        @info = (split ':', $line);
                        if ($f eq 'passwd') {
                                my $uid = $info[2];
                                my $isnormaluser = ($uid > $minUID) && ($uid < $maxUID);
                                next if (($which eq 'remote') ? $isnormaluser : !$isnormaluser);
                                $username{$info[0]} = TRUE;
                                $userUID{$uid} = TRUE;
                                $userGID{$info[3]} = TRUE;
                        } elsif ($f eq 'group') {
                                my $gid = $info[2];
                                my $isnormalgroup = ($gid > $minGID) && ($gid < $maxGID);
                                next if (($which eq 'remote') ? $isnormalgroup : !$isnormalgroup);
                                $usergroup{$info[0]} = TRUE;
                        } elsif ($f eq 'shadow') {
                                next if !exists $username{$info[0]};
                        } else {
                                next if !exists $usergroup{$info[0]};
                        }
                        # Any line that reaches this point is valid
                        print TMPFILE $line;
                }
                close TMPFILE;
                if ($which eq 'local') {
                        # send the file back
                        scp($tmpfile, "$remoteHost:$systemConfigDir/$f") or
                                die ("Could not send '$f' to '$remoteHost'");
                        unlink $tmpfile;
                }
        }
}

#--------------------------------------------------------
# Make sure we cleanup the temp files when we exit
#--------------------------------------------------------
END {
        my $tmpfile;
        foreach my $f ('passwd','group','shadow','gshadow') {
                $tmpfile = "$tmpDir/$f.REMOTE";
                unlink $tmpfile if -e $tmpfile;
        }
}

Perbarui 21MAY2010:kode yang diperbarui untuk meningkatkan sinkronisasi ID grup


Linux
  1. Fungsi Root Grup Pengguna??

  2. Daftar anggota grup di Linux

  3. Setel atau ubah kata sandi pengguna di Linux

  1. Bagaimana cara menambahkan pengguna ke grup di Linux

  2. Kata Sandi Panik di Linux

  3. Aktifkan kata sandi sederhana untuk pengguna root di CentOS

  1. Pembuatan Pengguna Dengan Opsi Perintah Mutiple?

  2. Kelola grup pengguna Linux

  3. Apa perbedaan antara menambahkan pengguna ke grup sudoers vs root?