Используя дистрибутив, производный от RedHat (CentOS), я хотел бы, чтобы список обычных пользователей (UID более 500) и группы (и теневые файлы) передавались на сервер резервного копирования.
Синхронизация только односторонняя, от главного сервера к резервному серверу.
Я действительно не хочу иметь дело с LDAP или NIS.
Все, что мне нужно, это простой скрипт, который можно запускать каждую ночь, чтобы обновлять сервер резервного копирования.
Главный сервер может подключиться к резервной системе по SSH.
Любое предложение?
Редактировать:
Спасибо за предложения, но я думаю, что недостаточно ясно выразился.
Я смотрю только на синхронизацию обычных пользователей, чьи UID больше 500.
Пользователи системы / службы (с UID ниже 500) могут быть разными в обеих системах.
Боюсь, вы не можете просто синхронизировать файлы целиком.
Вы можете использовать awk для извлечения пользователей / групп с идентификаторами 500 или выше. Я также взял на себя смелость исключить идентификатор пользователя 65534, который часто зарезервирован для пользователя "none" (в зависимости от дистрибутива; не знаю, делает ли это CentOS):
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
Затем используйте rsync, scp или выбранный вами метод передачи файлов, чтобы скопировать файлы в систему резервного копирования. Эти файлы затем могут быть добавлены в конец «чистого» файла пароля, группы или теневого файла, когда вам необходимо их восстановить (например: только системные пользователи / группы по умолчанию, чтобы предотвратить непреднамеренное дублирование идентификатора / имени пользователя).
cat passwd.new >> /etc/passwd
cat group.new >> /etc/group
cat shadow.new >> /etc/shadow
используйте cppw и 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.
NIS / NIS + были изобретены именно по этой причине.
Но они уродливые и централизованные (LDAP / Kerberos / SMB / и т. Д.), Аутентификация - намного лучшая идея, если вы можете это сделать. Для настройки NIS / NIS + вам потребуется:
Пакеты:
yp-tools ypbind ypserv portmap
и /etc/yp.conf с чем-то вроде:
domain example.org server nis.example.org
ypserver nis.example.org
а затем в / etc / sysconfig / network:
NISDOMAIN=example.org
И я поленился, вот хороший способ: http://www.wains.be/index.php/2007/02/28/setting-up-nis-under-centos-4/ это проведет вас через это.
Лично для резервного копирования я бы просто сделал резервную копию всего каталога / etc / и покончил с этим. Всего несколько мегабайт максимум.
Здесь есть много способов и решений, но для ответа на исходный вопрос есть три шага:
Создайте на сервере SSH-ключ без пароля:
ssh-keygen -b 4096
Скопируйте .ssh / id_rsa.pub в .ssh / authorized__keys2 на клиенте:
scp ~/.ssh/id_rsa.pub client:.ssh/authorized_keys2
Добавьте что-то подобное в ваш / etc / crontab (или отредактируйте с помощью crontab -e):
0 0 * * * scp /etc/{passwd,shadow,group} root@backupbox:/var/mybackupdir
Ну, я думал, что есть что-то, что я мог бы использовать без необходимости развертывать собственное решение, но мне нужно было что-то сделать быстро.
Ниже приведен сценарий, который сделает именно то, что мне нужно.
Чтобы он работал, просто измените несколько переменных конфигурации, чтобы минимальный и максимальный UID считались нормальный пользователя и имя удаленного хоста или IP-адрес.
Вы должны настроить удаленный сервер для приема входящих сеансов SSH от локального сервера. root
пользователь без необходимости вводить пароль.
Командир Кин намекнул, как это делается, в своем ответе на этой странице, но вы также можете обратиться к вход по SSH без пароля для получения подробных инструкций.
Сценарий копирует каждый из удаленных пароль, группа, тень, тень файлы с удаленного сервера во временное место на сервере lcoal.
Затем он удаляет эти временные файлы из всех "обычных" пользователей, оставляя только ссылки на пользователей системы.
Следующим шагом будет прохождение каждой из локальных версий пароль, группа, тень, тень и добавление только «обычных» пользователей к их соответствующим временным файлам, а затем загрузка каждого из них обратно на удаленный сервер для замены старого.
Прежде чем что-либо делать, убедитесь, что вы сделали копию своего пароль, группа, тень, тень как на локальном, так и на удаленном серверах.
Владение файлами и атрибуты сохраняются.
Временные файлы сохраняются в /tmp
и удален независимо от того, была синхронизация успешной или нет.
На локальном сервере не должно быть пароля root
доступ к резервной копии (но не наоборот). Это необходимо, чтобы мы могли получить файлы конфигурации учетных записей пользователей (которые в противном случае ограничены).
Это первая попытка, и это немного запутанный (не красивый код), но он выполняет свою работу довольно хорошо, и кто-то другой может найти его полезным.
Это сценарий Perl, который зависит только от Net::SCP
модуль для безопасного копирования файлов между серверами.
#!/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;
}
}
Обновление 21 мая 2010 г.: обновлен код для улучшения синхронизации идентификатора группы.
Я использую rsync в записи crontab, чтобы выполнить простое резервное копирование, выполняющее то же самое. К сожалению, я не делаю этого по ssh. Моя запись в crontab выглядит так:
0 4 * * 0 rsync -av --delete / etc / / backup / etc /
На самом деле мой crontab запускает мой сервер NAS, то есть второй путь, который вы видите в списке выше, через wake-on-lan, а затем выполняет несколько резервных копий, и это просто одно из них. Затем Cron отправляет мне электронное письмо, в котором сообщает, что было скопировано, то есть какие файлы были синхронизированы и т. Д.
Я не собирался делать это по ssh, но надеюсь, что это поможет.
Требование только частичной синхронизации означает, что сценарий должен быть намного более сложным и, следовательно, с большей вероятностью будет содержать какие-то ошибки. Лично я бы потратил некоторое время и исследовал, сколько усилий потребует просто исправить эти другие учетные записи. Я не знаю, о скольких службах мы говорим, но я предполагаю, что все, что вам нужно будет сделать после изменения идентификаторов учетных записей служб, - это обновить владельца некоторых файлов.
Если вы хотите сделать что-то действительно простое, вы можете настроить, например первый (вступление), чтобы просто отправить нужные файлы на другой сервер. Для обеспечения безопасности вам потребуется настроить доступ по ssh на основе ключей для использования процессом rdist.