Назад | Перейти на главную страницу

Повторно использовать удаленные ssh-соединения и уменьшить подробность ведения журнала команд / сеансов?

У меня есть несколько систем, которые полагаются на зеркалирование на уровне приложений на вторичный сервер. Вторичный сервер извлекает данные с помощью серии удаленных команд SSH, выполняемых на первичном. Приложение похоже на черный ящик, и я может не сможет вносить изменения в используемые скрипты.

Моя проблема в том, что вход в / var / log / secure полностью заполнен запросами от пользователя службы, admin. Эти команды выполняются много раз в секунду и оказывают соответствующее влияние на журналы. Они полагаются на обмен ключами без парольной фразы. Используемая ОС - EL5 и EL6. Пример ниже.

Пример вывода журнала:

Jul 24 19:08:54 Cantaloupe sshd[46367]: pam_unix(sshd:session): session closed for user admin
Jul 24 19:08:54 Cantaloupe sshd[46446]: Accepted publickey for admin from 172.30.27.32 port 33526 ssh2
Jul 24 19:08:54 Cantaloupe sshd[46446]: pam_unix(sshd:session): session opened for user admin by (uid=0)
Jul 24 19:08:54 Cantaloupe sshd[46446]: pam_unix(sshd:session): session closed for user admin
Jul 24 19:08:54 Cantaloupe sshd[46475]: Accepted publickey for admin from 172.30.27.32 port 33527 ssh2
Jul 24 19:08:54 Cantaloupe sshd[46475]: pam_unix(sshd:session): session opened for user admin by (uid=0)
Jul 24 19:08:54 Cantaloupe sshd[46475]: pam_unix(sshd:session): session closed for user admin
Jul 24 19:08:54 Cantaloupe sshd[46504]: Accepted publickey for admin from 172.30.27.32 port 33528 ssh2
Jul 24 19:08:54 Cantaloupe sshd[46504]: pam_unix(sshd:session): session opened for user admin by (uid=0)
Jul 24 19:08:54 Cantaloupe sshd[46504]: pam_unix(sshd:session): session closed for user admin
Jul 24 19:08:54 Cantaloupe sshd[46583]: Accepted publickey for admin from 172.30.27.32 port 33529 ssh2
Jul 24 19:08:54 Cantaloupe sshd[46583]: pam_unix(sshd:session): session opened for user admin by (uid=0)
Jul 24 19:08:54 Cantaloupe sshd[46583]: pam_unix(sshd:session): session closed for user admin
Jul 24 19:08:54 Cantaloupe sshd[46612]: Accepted publickey for admin from 172.30.27.32 port 33530 ssh2
Jul 24 19:08:54 Cantaloupe sshd[46612]: pam_unix(sshd:session): session opened for user admin by (uid=0)
Jul 24 19:08:54 Cantaloupe sshd[46612]: pam_unix(sshd:session): session closed for user admin
Jul 24 19:08:55 Cantaloupe sshd[46641]: Accepted publickey for admin from 172.30.27.32 port 33531 ssh2
Jul 24 19:08:55 Cantaloupe sshd[46641]: pam_unix(sshd:session): session opened for user admin by (uid=0)
Jul 24 19:08:55 Cantaloupe sshd[46641]: pam_unix(sshd:session): session closed for user admin
Jul 24 19:08:55 Cantaloupe sshd[46720]: Accepted publickey for admin from 172.30.27.32 port 33532 ssh2
Jul 24 19:08:55 Cantaloupe sshd[46720]: pam_unix(sshd:session): session opened for user admin by (uid=0)
Jul 24 19:08:55 Cantaloupe sshd[46720]: pam_unix(sshd:session): session closed for user admin
Jul 24 19:08:55 Cantaloupe sshd[46749]: Accepted publickey for admin from 172.30.27.32 port 33533 ssh2
Jul 24 19:08:55 Cantaloupe sshd[46749]: pam_unix(sshd:session): session opened for user admin by (uid=0)
Jul 24 19:08:55 Cantaloupe sshd[46749]: pam_unix(sshd:session): session closed for user admin
Jul 24 19:08:55 Cantaloupe sshd[46778]: Accepted publickey for admin from 172.30.27.32 port 33534 ssh2
Jul 24 19:08:55 Cantaloupe sshd[46778]: pam_unix(sshd:session): session opened for user admin by (uid=0)
Jul 24 19:08:55 Cantaloupe sshd[46778]: pam_unix(sshd:session): session closed for user admin
Jul 24 19:08:55 Cantaloupe sshd[46857]: Accepted publickey for admin from 172.30.27.32 port 33535 ssh2

В частности, отвечая на вопрос о том, можно ли уменьшить накладные расходы на создание большего количества соединений SSH: Да. Вы можете использовать функцию ControlMaster, присутствующую в OpenSSH 5.5. В этом сообщении блога будет более подробная информация: http://puppetlabs.com/blog/speed-up-ssh-by-reusing-connections

Я не уверен, повлияет ли это на количество журналов. Но, в зависимости от того, как написано приложение, эту функцию можно использовать без фактического изменения приложения, просто перенастроив OpenSSH. Предполагая, что он даже использует OpenSSH в качестве клиента или другого клиента с этой поддержкой. Здесь просто недостаточно информации, чтобы сказать наверняка.

Поскольку вы используете rsyslog, у вас есть возможность фильтр сообщения довольно легко. Базовый пример отбрасывания сообщений:

#/etc/rsyslog.cof 

# this is original log file including all authpriv messages regarding admin
authpriv.* /var/log/secure.admin

# These rules filter the remote key based logins for admin
:msg, contains, "Accepted publickey for admin from 172.30.27.32" ~
:msg, contains, "session opened for user admin" ~
:msg, contains, "session closed for user admin" ~
authpriv.*     /var/log/secure

Тильда ~ - инструкция по удалению сообщений, содержащих предыдущую строку.

Немного более продвинутый и лучший синтаксис (непроверенный):

if $syslogfacility-text == 'authpriv' and 
 ($msg contains 'for user admin' or $msg contains 'publickey for admin from 172.30.27.32') 
then /var/log/secure.admin

if $syslogfacility-text == 'authpriv' and not
 ($msg contains 'for user admin' or $msg contains 'publickey for admin from 172.30.27.32') 
then /var/log/secure

Где каждый оператор if занимает одну строку.

Новости об этом ...

Я решил эту проблему в своих системах RHEL / CentOS EL6, включив функцию SSH ControlMaster:

На подключающемся хосте /home/username/.ssh/config файл:

Host *
ControlMaster auto
ControlPath ~/.ssh/sockets/%r@%h-%p
#ControlPersist 600

В ~/.ssh/sockets/ каталог нужно было создать вручную.

В ControlPersist директива - это функция постоянства, которая не был перенесен на OpenSSH, доступный в EL6. Я бы хотел, чтобы это было так, потому что без него мультиплексные соединения завершаются, как только начальное соединение умирает.

Я обошел это быстрым и грязным Монит скрипт на подключающемся хосте.

check process ssh-control
        matching "MNn"
        start program = "/usr/bin/ssh -MNn destination" as uid username
        stop program = "/usr/bin/pkill -u username ssh"

Где находится система, к которой я подключаюсь, и где находится служебная учетная запись системы репликации приложений (админ в таком случае).

В ssh -M используется для совместного использования соединения в режиме master и SSH.

-M Переводит ssh-клиент в «главный» режим для совместного использования соединения. Несколько опций -M переводят ssh в «главный» режим с подтверждением, требуемым перед приемом подчиненных подключений.

Результатом всего этого является чистые журналы... и что множество команд ssh, инициированных сервером репликации, повторно используют открытый сокет, созданный главным соединением.

Как только эта функция войдет в пакет EL6 OpenSSH, я смогу избавиться от сценария Monit и просто использовать ControlPersist параметр.