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

Записать ssh REMOTE_USER в журналы аудита или истории

В нашей компании обычно есть один продакшн-пользователь. user и мы ssh на наши серверы через вход без пароля с ключами ssh.

Сейчас на этих серверах работает довольно много людей, и иногда нам нужно понять, почему были внесены изменения и кто их сделал. Для этого мы хотели бы проводить аудит команд bash, но нам также необходимо сохранить исходный идентификатор удаленного пользователя. это объясняет, как определить ${REMOTE_USER} переменная, но как мы можем сохранить ее в журналах истории / аудита для каждой команды?

В идеале лучше всего предоставить каждому свою собственную пару ключей ssh, свою учетную запись для входа и использовать sudo чтобы отслеживать, кто что и где делает. Если у вас нет централизованной аутентификации и более пары серверов, поддержание всех этих учетных записей может быть беспорядочным (примечание: см. ansible для более простого способа без LDAP), не говоря уже о сохранении изменений пароля.

Раньше я требовал от удаленного пользователя экспортировать в свою систему переменную с именем LC_SSH_USER. Эта переменная может быть принята конфигурацией sshd через AcceptEnv LANG LC_* настройка. Сценарий в /etc/profile.d запускается при входе в систему и "дезинфицирует" переменную и / или завершает соединение, если переменная не найдена. Кроме того, readonly Атрибут установлен для переменной, поэтому непреднамеренные изменения переменной не могут быть легко внесены. Таким образом, независимо от того, в какую учетную запись вошел удаленный пользователь (www-data, passenger, admin) исходящий пользователь зарегистрирован. Систему можно достаточно легко обойти, установив для своих переменных все, что они хотят, однако для решения этой проблемы может быть введена кадровая политика.

образец сценария разместить в /etc/profile.d/lc-ssh-user.sh который будет регистрировать LC_SSH_USER в /var/log/auth.log (в Ubuntu):

# only allow letters, numbers and underscores in passed LC_SSH_USER variable
lc_ssh_user_sanitize()
{
   arg="{$1}"
   # first, strip underscores
   clean="${arg//_/}"

   # next, replace spaces with underscores
   clean="${clean// /_}"

   # now, clean out anything that's not alphanumeric or an underscore
   ret="${clean//[^a-zA-Z0-9_]/}"

   echo "${ret}"
}

# if SSH_CLIENT is not set, and LC_SSH_USER is not set, then this is a local login or a new shell opened by same user
if [ -z "${SSH_CLIENT}" ] && [ -z "${LC_SSH_USER}" ]; then
   export LC_SSH_USER=${USER}
else
   # otherwise, this is an ssh session - extract the connecting IP from env
   con=`echo "${SSH_CLIENT}" | cut -d'=' -f2 | cut -d' ' -f1`

   # export some variables needed for the user environment
   # when using "su --preserve-environment  userxxx --login" be sure to fixup needed variables
   export USER=`whoami`
   export LOGNAME=${USER}
   export HOME=$( getent passwd "$USER" | cut -d: -f6 )
   cd ${HOME}

   # user login without LC_SSH_USER set on their local machine
   if [ -z "${LC_SSH_USER}" ]; then
      echo "Error: LC_SSH_USER not set in connection from ${con} as user $USER" | logger -p auth.info
      #
      # connection could probably be terminated here to enforce the use of LC_SSH_USER
      #

      # since there is no LC_SSH_USER in the connection, just use whatever the user logged in as
      export LC_SSH_USER=${USER}
      echo "Notice: LC_SSH_USER set from login ${USER} from ${con}" | logger -p auth.info
   else
      # user has LC_SSH_USER set, so sanitize it (just in case) and log the sanitized version to syslog via logger
      u_sanitized=$(lc_ssh_user_sanitize "${LC_SSH_USER}")
      echo "Notice: LC_SSH_USER ${u_sanitized} login from ${con} as user $USER" | logger -p auth.info
   fi
fi

# always make LC_SSH_USER  readonly in the users environment
readonly LC_SSH_USER

Обновление: использование git commit hook $LC_SSH_USER:

#!/bin/sh
# To enable this hook drop this in ".git/hooks/pre-commit" (chmod 0755)
# It will create .commit_template if it does not exist
# add these lines to .git/config:
# [commit]
#   template = .commit_template
#
test -f .commit_template && exit 
echo "
Fix   : 
Issue : 
Author: $LC_SSH_USER
" > .commit_template