Um pouco de SysAdmin

linux, Telefonia IP, *BSD's, Segurança

Monitorar logins realizados via SSH

with 2 comments

logo_shellNessa artigo vou mostrar como monitorar os logins realizados via SSH de forma simples, usando somente shell script e um pouco de conhecimento sobre o bash.

Primeiro vamos dar uma olhada no man 1 do bash e do ssh

man 1 bash

Na sessão INVOCATION

When bash is invoked as an interactive login shell, or as a non-interactive shell with the –login option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable. The –noprofile option may be used when the shell is started to inhibit this behavior.

When a login shell exits, bash reads and executes commands from the file ~/.bash_logout, if it exists.

Portanto se o nosso usuário estiver utilizando o Bash, sabemos que o arquivo “/etc/profile” será invocado quando o usuário fazer login no sistema.

man 1 ssh

Na sessão ENVIRONMENT

ssh will normally set the following environment variables:

DISPLAY The DISPLAY variable indicates the location of the X11 server. It is automatically set by ssh to point to a value of the form “hostname:n”, where “hostname” indicates the host where the shell runs, and `n’ is an integer ≥ 1. ssh uses this special value to forward X11 connections over the secure channel. The user should normally not set DISPLAY explicitly, as that will render the X11 connection insecure (and will require the user to manually copy any required authorization cookies).

HOME Set to the path of the user’s home directory.

LOGNAME Synonym for USER; set for compatibility with systems that use this variable.

MAIL Set to the path of the user’s mailbox.

PATH Set to the default PATH, as specified when compiling ssh.

SSH_ASKPASS If ssh needs a passphrase, it will read the passphrase from the current terminal if it was run from a terminal. If ssh does not have a terminal associated with it but DISPLAY and SSH_ASKPASS are set, it will execute the program specified by SSH_ASKPASS and open an X11 window to read the passphrase. This is particularly useful when calling ssh from a .xsession or related script. (Note that on some machines it may be necessary to redirect the input from /dev/null to make this work.)

SSH_AUTH_SOCK Identifies the path of a UNIX-domain socket used to communicate with the agent.

SSH_CONNECTION Identifies the client and server ends of the connection. The variable contains four space-separated values: client IP address, client port number, server IP address, and server port number.

SSH_ORIGINAL_COMMAND This variable contains the original command line if a forced command is executed. It can be used to extract the original argu-ments.

SSH_TTY This is set to the name of the tty (path to the device) associated with the current shell or command. If the current session has no tty, this variable is not set.

TZ This variable is set to indicate the present time zone if it was set when the daemon was started (i.e. the daemon passes the value on to new connections).

USER Set to the name of the user logging in.

Additionally, ssh reads ~/.ssh/environment, and adds lines of the format “VARNAME=value” to the environment if the file exists and users are allowed to change their environment. For more information, see the PermitUserEnvironment option in sshd_config(5).

Conhecemos todas as variaveis de ambientes que podem ser setadas quando o login é feito via ssh.

Agora vamos usar um pouco de criatividade 🙂

Vamos adicionar uma verificação no momento do login do usuário, se o login for feito via SSH, disparamos um e-mail para o sysadmin informando o usuário e o IP de origem que fez a conexão.

Estou validando o login via ssh e se a variavél SSH_TTY não é nula, nesse caso fazendo o envio de e-mail informando o sysadmin.

Segue um exemplo para adição no /etc/profile

# Notificacao login ssh por SMS/E-mail

# E-mail’s/SMS para receber as notificacoes

to=(email@email.com.br)

to_sms=(email@email.com.br)

# Usuario SMTP

from=’XXXXXXXXXXXXXXXXXXX’

smtp_server=’XXXXXXXXXXXXXX’

smtp_user=’XXXXXXXXXXXXXXX’

smtp_passwd=’XXXXXXXXXXXXX’

# Binario do sendEmail (Envio por SMTP Auth)

mailcmd=’/usr/bin/sendEmail -q’

# Pega informacoes do login feito por SSH

SSHCLIENT=$(echo $SSH_CLIENT|awk ‘{print $1}’)

if [ -n “$SSH_TTY” ]; then

subject=”URGENTE – Login realizado no bob-espoja”

mensagem=”Usuario: $USER realizou o login partir do IP: $SSHCLIENT”

# Notifica via e-mail

for ((b=0;$b<${#to[*]};b++)); do

$mailcmd -q -f “$from” -t “${to[$b]}” -u “$subject” -s “$smtp_server” -xu “$smtp_user” -xp “$smtp_passwd” -m “$mensagem”

done

# Notifica via SMS

for ((b=0;$b<${#to_sms[*]};b++)); do

$mailcmd -q -f “$from” -t “${to_sms[$b]}” -u “$subject” -s “$smtp_server” -xu “$smtp_user” -xp “$smtp_passwd” -m “$mensagem”

done

fi

Nesse exemplo estou usando o SendEmail para envio dos e-mails, nada impede de usar o smtp local, outro software, etc, etc ..

Anúncios

Written by lucianoborguetti

novembro 1, 2009 às 10:21 pm

2 Respostas

Subscribe to comments with RSS.

  1. Ow luciano muito útil essa idéia em..rrs vou usar aki..
    olha só como faço para utilizar o envio de mensagem por smtp local…

    Garcia

    dezembro 7, 2009 at 10:29 am

    • Fala grande Garcia.

      Para usar o smtp local, você pode trocar o sendEmail pelo binário do sendmail.

      Abraço,

      lucianoborguetti

      dezembro 7, 2009 at 2:27 pm


Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: