Vejo duas boas maneiras de obter esse tipo de informação. Uma é aumentar o registro do próprio sshd e a outra, fazer um monitoramento mais profundo do repositório git no disco. Como nenhum dos dois individualmente fornece as informações desejadas, você pode fazer as duas coisas e correlacionar os dados do log usando um mecanismo de análise de log externo ou sob demanda usando olhos humanos e registros de data e hora.
Modificações sshd
Por padrão, como você sem dúvida viu, é possível ver quando um usuário efetuou login e de onde, usando os logs de autenticação ssh. O que você quer fazer é alterar o nível em que você está desconectando do sshd. Então edite seu /etc/ssh/sshd_config
e encontre a linha que se parece
#LogLevel INFO
e mude isso para
LogLevel VERBOSE
em seguida, reinicie o serviço sshd. Isso aumenta o nível de log do sshd em 1 etapa, o que fornece muito mais informações. Confira este trecho de log do meu acesso remoto depois de fazer essa alteração.
Nov 2 08:37:09 node1 sshd[4859]: Connection from 10.10.10.5 port 50445
Nov 2 08:37:10 node1 sshd[4859]: Found matching RSA key: f2:9e:a1:ca:0c:33:02:37:9b:de:e7:63:d5:f4:25:06
Nov 2 08:37:10 node1 sshd[4860]: Postponed publickey for scott from 10.10.10.5 port 50445 ssh2
Nov 2 08:37:10 node1 sshd[4859]: Found matching RSA key: f2:9e:a1:ca:0c:33:02:37:9b:de:e7:63:d5:f4:25:06
Nov 2 08:37:10 node1 sshd[4859]: Accepted publickey for scott from 10.10.10.5 port 50445 ssh2
Nov 2 08:37:10 node1 sshd[4859]: pam_unix(sshd:session): session opened for user scott by (uid=0)
Nov 2 08:37:10 node1 sshd[4859]: User child is on pid 4862
Nov 2 08:40:27 node1 sshd[4862]: Connection closed by 10.10.10.5
Nov 2 08:40:27 node1 sshd[4862]: Transferred: sent 30632, received 7024 bytes
Nov 2 08:40:27 node1 sshd[4862]: Closing connection to 10.10.10.5 port 50445
Nov 2 08:40:27 node1 sshd[4859]: pam_unix(sshd:session): session closed for user scott
As coisas importantes a serem observadas aqui são duas
- Vemos a impressão digital da chave pública usada para me autenticar
- Vemos o carimbo de data e hora do meu logoff
O uso do sshd LogLevel (INFO) padrão não registra nenhum desses itens. Obter a impressão digital de uma chave é um passo extra. Você precisa processar o authorized_keys
arquivo apropriado com o ssh-keygen como tal.
[root@node1 ssh]# ssh-keygen -l -f /home/scott/.ssh/authorized_keys
4096 f2:9e:a1:ca:0c:33:02:37:9b:de:e7:63:d5:f4:25:06 /home/scott/.ssh/authorized_keys (RSA)
Então agora você conhece as seguintes informações:
- Nome de usuário que efetuou logon
- Hora em que o usuário fez logon
- Qual chave pública foi usada para autenticação
- Hora em que o usuário fez logoff
Agora que temos uma maneira de atribuir a ação do usuário em um horário específico, supondo que os dois usuários não tenham efetuado login ao mesmo tempo, podemos começar a analisar as alterações feitas no repositório.
Monitoramento de Diretório com Auditd
Como o sysadmin1138 disse, esse poderia ser um excelente caso de uso para o subsistema auditd. Se você não estiver usando uma distribuição baseada em RedHat, provavelmente existe um analógico, mas será necessário encontrá-lo. A configuração do auditd é bastante intensa e possui um número redonkulous de opções de configuração. Para ter uma idéia de algumas das opções, consulte esta pergunta em nosso site irmão para Profissionais de Segurança da Informação .
No mínimo, eu recomendaria configurar o que é chamado de "watch" no diretório em disco que contém seu repositório git em questão. O que isso faz é instruir o módulo do kernel a relatar tentativas de realizar chamadas de acesso a arquivos, como open()
ou creat()
, em identificadores de arquivos apontando para os arquivos ou diretórios listados.
Aqui está um exemplo de configuração que faria isso, e somente isso. Portanto, tenha cuidado para ler e entender a sua existência /etc/audit/audit.rules
, a fim de integrar as mudanças adequadamente.
# This file contains the auditctl rules that are loaded
# whenever the audit daemon is started via the initscripts.
# The rules are simply the parameters that would be passed
# to auditctl.
# First rule - delete all
-D
# Increase the buffers to survive stress events.
# Make this bigger for busy systems
-b 1024
-w /path/to/git/repos-p wa
# Disable adding any additional rules - note that adding *new* rules will require a reboot
-e 2