Osiris - Host Integrity Monitoring System

Ricardo Iramar dos Santos - Agent Smith
08/09/2004 - Versão 0.1



Introdução

Aqui no escritório precisamos de uma solução para verificar a integridade dos arquivos constantemente que fosse client/server (logs centralizados) e multi-plataforma (Linux e Windows).

Primeiro tentei com o Samhain (http://la-samhna.de/samhain/), mas ele não funcionou como client/server nem seguindo a documentação a risca. Bem, pensei que o problema era entre a cadeira e o monitor (/me), por coincidência um amigo (web_knows/Ribamigo) também estava testando o Samhain, adivinha? Também não conseguiu. Toda essa histórinha é só para falar que se você conseguir instalar o Samhain e funcionar na configuração client/server favor mandar um mail para ricardo.iramar@gmail.com informando a façanha.

Como o Samhain não funcionava parti para uma outra solução chamada Osiris (http://osiris.shmoo.com) que funcionou de primeira e atendeu a todas as nossas expectativas.

O Osiris é totalmente modular, isto é, dividido em três partes que são: osirisimd (daemon que gerência tudo), osirisd (daemon responsável pela verificação) e osiris (aplicativo de linha de comando). Por enquanto só os nomes e funções é o que nos interessa.

Vamos parar de papo e começar logo.

Pré-requisitos

- osiris-4.0.3.tar.gz (http://osiris.shmoo.com/data/osiris-4.0.3.tar.gz).

Instalação

O source dos três componentes do Osiris estão todos em um único arquivo (osiris-4.0.3.tar.gz), portanto será necessário copia-lo tanto para o server (matrix) como client (trinity).

Iremos instalar primeiro o daemon osirismd no server pois ele será o responsavel por gerenciar os logs gerados pelos clients.

Primeiro crie um usuário e um grupo com nome osiris no seu server, o osirismd por padrão é executado por esse usuário e grupo por questões de segurança.

Agora a instalação do osirismd própriamente dita.

  	ricardo@matrix:~/src/Osiris$ tar zxvf osiris-4.0.1.tar.gz
  	ricardo@matrix:~/src/Osiris$ cd osiris-4.0.1
  	ricardo@matrix:~/src/Osiris/osiris-4.0.1$ ./configure
  	(...)
  	ricardo@matrix:~/src/Osiris/osiris-4.0.1$ make console
  	(...)
  	ricardo@matrix:~/src/Osiris/osiris-4.0.1$ su
  	ricardo@matrix:~/src/Osiris/osiris-4.0.1# make install
  	(...)
  	Install osiris agent? (y/n) [y] n
  	Install management console? (y/n) [y]  
  	Install CLI? (y/n) [y]  
  	Installation directory for binaries: [/usr/local/sbin]
  	(...)	
   	Start management console now? (y/n) [y] n
  	 --> to start management console, run: /usr/local/sbin/osirismd
  	Start scan agent now? (y/n) [y]  n
  	 --> to start the scan agent, do sudo /usr/local/sbin/osirisd
  	(...)
  	ricardo@matrix:~/src/Osiris/osiris-4.0.1#

Se você utiliza Slackware faça a limpeza abaixo, pois o Slackware segue o padrão BSD para inicialização e não SystemV apesar de suportar.

  	ricardo@matrix:~/src/Osiris/osiris-4.0.1# cd /etc/rc.d
  	ricardo@matrix:/etc/rc.d# mv osirismd rc.osirismd
  	ricardo@matrix:/etc/rc.d# rm -R rc[3-5].d
  	ricardo@matrix:/etc/rc.d# echo "./rc.osirismd start" >> rc.local
  	ricardo@matrix:/etc/rc.d# exit
  	ricardo@matrix:~/src/Osiris/osiris-4.0.1$

Para essa versão do osiris (4.0.1) existe um bug nesses script rc.osrismd. Edite este arquivo e altere a linha "killall osirisd -TERM" para "killall osirismd -TERM". Perceba que a pessoa deve ter copiado o script do outro daemon e esqueceu de alterar o nome do arquivo. Agora vamos instalar o client em uma outra maquina, o procedimento é bem parecido. Não se esqueça de criar o usuário e o grupo com nome osiris nas maquinas clients também.

  	ricardo@trinity:~/src/Osiris$ tar zxvf osiris-4.0.1.tar.gz
  	ricardo@trinity:~/src/Osiris$ cd osiris-4.0.1
  	ricardo@trinity:~/src/Osiris/osiris-4.0.1$ ./configure
  	(...)
  	ricardo@trinity:~/src/Osiris/osiris-4.0.1$ make agent
  	(...)
  	ricardo@trinity:~/src/Osiris/osiris-4.0.1$ cd src/install/
  	ricardo@trinity:~/src/Osiris/osiris-4.0.1/src/install$ tar zxvf osiris-agent-4.0.1-release-unknown-Linux-2.4.26.tar.gz
  	(...)
  	ricardo@trinity:~/src/Osiris/osiris-4.0.1/src/install$ cd osiris-agent-4.0.1-release
  	ricardo@trinity:~/src/Osiris/osiris-4.0.1/src/install/osiris-agent-4.0.1-release$ su
  	ricardo@trinity:~/src/Osiris/osiris-4.0.1/src/install/osiris-agent-4.0.1-release# ./install.sh
  	Install osiris agent? (y/n) [y]
  	Installation directory for binaries: [/usr/local/sbin]
  	(...)
  	Start scan agent now? (y/n) [y]  n
  	 --> to start the scan agent, do sudo /usr/local/sbin/osirisd
  	(...)
  	ricardo@trinity:~/src/Osiris/osiris-4.0.1/src/install/osiris-agent-4.0.1-release#

Faça a limpeza novamente pelo mesmo motivo.

  	ricardo@trinity:~/src/Osiris/osiris-4.0.1/src/install/osiris-agent-4.0.1-release# cd /etc/rc.d
  	ricardo@trinity:/etc/rc.d# mv osirisd rc.osirisd
  	ricardo@trinity:/etc/rc.d# rm -R rc[3-5].d
  	ricardo@trinity:/etc/rc.d# echo "./rc.osirisd start" >> rc.local
  	ricardo@trinity:/etc/rc.d#  exit
  	ricardo@trinity:~/src/Osiris/osiris-4.0.1/src/install/osiris-agent-4.0.1-release$

Configuração

Primeiro precisamos iniciar o daemon osirismd no server para iniciar as configurações.

  	ricardo@matrix:/etc/rc.d#./rc.osirismd start
  	Starting osirismd:osirismd: missing configuration file,
  	  ==> created default in: /usr/local/osiris/osirismd.conf.
  	unable to load server certificate (/usr/local/osiris/certs/osirismd.crt)
  	  ==> creating one.
  	Generating RSA key, 2048 bit long modulus.
  	...+++
  	..................+++

A primeira configuração deve ser feita localmente através da linha de comando pois por padrão e segurança a primeira conexão com o daemon só poderá ser feita desta forma. Nesta primeira conexão será criado os certificados para podermos fazer uma conexão segura. Nesta primeira configuração iremos logar com o usuário admin que por padrão esta sem senha. Em seguida iremos alterar a sua senha como pode ser visto abaixo.

  
  	ricardo@trinity:~$ /usr/local/sbin/osiris
  	Osiris Shell Interface - version 4.0.1-release
  	(...)
  	Are you sure you want to continue connecting (yes/no)? y
  	 >>> authenticating to (localhost)
  
  	User: admin
  	Password:
  
  	connected to management console, code version (4.0.1-release).
  	hello.
  
  	WARNING: your password is empty, use the 'passwd' command
  	to set your password.
  
  	osiris-4.0.1-release: passwd admin
  	Password:
  	 >>> user: (admin) updated.
  	current login was edited, you must re-authenticate.
  	 >>> authenticating to (localhost)
  
  	Password:
  
  	connected to management console, code version (4.0.1-release).
  	hello.
  
  	osiris-4.0.1-release:

Agora você já esta na linha de comando do osiris, o funcionamente é bem simples, veja abaixo dois comandos básicos.

  	osiris-4.0.1-release: users
  	
  	  [ name ]
  
  	  admin
  
  	total: 1 users.
  
  	osiris-4.0.1-release: help
  
  	[ Management Commands ]
  	    mhost              host             new-user         edit-filters
  	    edit-mhost         edit-host        edit-user        print-filters
  	    print-mhost-config list-hosts       list-users
  	    test-notify        new-host         delete-user
  
  	[ Host commands ]
  	    status              list-configs      start-scan    list-db
  	    watch-host          import-config     stop-scan     base-db
  	    disable-host        push-config                     set-base-db
  	    host-details        edit-config       list-logs     print-db
  	    print-host-config   print-config      print-log     print-db-errors
  	    rm-host             rm-config                       print-db-header
  	    init                drop-config                     rm-db
  	    config              verify-config
  	                        new-config
  
  	[ Misc commands ]
  	    help           version             quit              ssl
  
  	  For help with a specific command, try: help <command>
  
  	osiris-4.0.1-release:

Antes de iniciarmos as configurações dos clients precisamos fazer a configuração básica do server.

  	osiris-4.0.1-release: edit-mhost
  
  	[ edit management host (localhost) ]
  
  	  > syslog facility [DAEMON]:
  	  > control port [2266]:
  	  > http host name (uses system name by default) []:
  	  > http control port [2267]:
  	  > notification email []: agent.smith@meudominio.com.br
  	  > notification smtp host [127.0.0.1]:
  	  > notification smtp port [25]:
  
  	  > authorized hosts:
  
  	   127.0.0.1

A maioria das opções são as padrões, não pe necessário alterar a não ser que você saiba o que esta fazendo. Para que as notificações por e-mail você precisar ter um smtp local (nosso caso) ou interno que não use autenticação para envio de e-mails.

  	  Modify authorization list (y/n)? [n] y
  
  	    s) show current listing.
  	    a) add a new authorized host.
  	    r) remove authorized host.
  	    q) quit
  
  	    > a
  	    > authorized hostname/IP (*=wildcard): 192.168.0.*

No caso acima adicionei a rede 192.168.0.* na lista de hosts autorizados a se conectar ao server.

  	    s) show current listing.
  	    a) add a new authorized host.
  	    r) remove authorized host.
  	    q) quit
  
  	    > q
  
  	[ management config (localhost) ]
  	
  	syslog_facility = DAEMON
  	control_port = 2266
  	http_port = 2267
  	http_host =
  	notify_email = agent.smith@meudominio.com.br
  	notify_smtp_host = 127.0.0.1
  	notify_smtp_port = 25
  	hosts_directory =
  	allow = 127.0.0.1
  	allow = 192.168.0.*
  
  
  	Is this correct (y/n)? y
  	 >>> management host configuration has been saved.
  	osiris-4.0.1-release:

Pronto, o server já esta configurado para recerber os hosts. Inicio o agent na máquina client para podermos adicionar a mesma no server.

  	ricardo@trinity:/etc/rc.d#./rc.osirisd start
  	Starting osirisd:

Volte para a linha de comando no server para adicionarmos o client nas configurações. Informe o nome, IP e descrição para o seu client e mantenha as outras opções padrões.

  	osiris-4.0.1-release: new-host
  	
  	[ new host ]
  	
  	  > name this host []:  trinity
  	  > hostname/IP address []: 192.168.0.101
  	  > description []: trinity scan agent
  	  > agent port [2265]:
  	  > enable log files for this host? (yes/no) [no]:

No passo abaixo referente a base de verificações aceite todas as opções padrões. Esse passo é totalmente auto-explicativo.

  	Scan Databases:
  	
  	    => keep archives of scan databases?  Enabling this option means that the
  	       database generated with each scan is saved, even if there are no changes
  	       detected.  Because of disk space, this option is not recommended
  	       unless your security policy requires it. (yes/no) [no]:
  	
  	    => auto-accept changes?  Enabling this option means that detected
  	       changes are reported only once, and the baseline database is
  	       automatically set when changes are detected. (yes/no) [yes]:
  	
  	    => purge database store?  Enabling this option means that none
  	       of the scan databases are saved.  That is, whenever the baseline database
  	       is set, the previous one is deleted. (yes/no): [yes]:

Abaixo configure as opções de notificação conforme a sua necessidade.

  	Notifications:
  
  	    => enable admin email notification for this host? (yes/no) [no]: yes
  	    => send notification on scheduled scans failures? (yes/no) [no]: yes
  	    => send scan notification, even when no changes detected  (yes/no) [no]:
  	    => send notification when agent has lost session key  (yes/no) [no]: yes
  	    => notification email (default uses mhost address) []:

Neste próximo passo iremos configurar quando a primeira verificação será iniciada e a frequência com a qual deve ser feita. A opção padrão para a primeira verificação é o horário atual da máquina e a frequência é de 1440 minutos (24 horas, ou melhor, uma vez ao dia).

  	  > configure scan scheduling information? (yes/no) [no]: yes
  	
  	    [ scheduling information for trinity ]
  	
  	    Scheduling information consists of a start time and a frequency value.
  	    The frequency is a specified number of minutes between each scan, starting
  	    from the start time.  The default is the current time.  Specify the start
  	    time in the following format: mm/dd/yyyy HH:MM
  	
  	    enter the start date and time
  	    using 'mm/dd/yyyy HH:MM' format: [Sun Aug 29 09:14:21 2004]
  	    enter scan frequency in minutes: [1440]

Confirme suas opções e siga em frente.

  	  > activate this host? (yes/no) [yes]:
  	
  	host                  => trinity
  	hostname/IP address   => 192.168.0.101
  	description           => trinity scan agent
  	agent port            => 2265
  	host type             => generic
  	log enabled           => no
  	archive scans         => no
  	auto accept           => yes
  	purge databases       => yes
  	notifications enabled => yes
  	notifications always  => no
  	notify on rekey       => yes
  	notify on scan fail   => yes
  	notify email          => (management config)
  	scans starting on     => Sun Aug 29 09:14:21 2004
  	scan frequency        => daily (every 1440 minutes).
  	enabled               => yes
  	
  	Is this correct (y/n)? y
  	 >>> new host (trinity) has been created.

Com tudo configurado inicie o host para a primeira verificação. Note que foi utilizado um arquivo padrão "default.linux" para a configuração dos arquivos que devem ser checados, falaremos mais sobre isso mais tarde.

  	Initialize this host? (yes/no): yes
  	
  	Initializing a host will push over a configuration, start
  	a scan, and set the created database to be the
  	trusted database.
  	
  	Are you sure you want to initialize this host (yes/no): yes
  	
  	OS Name: Linux
  	OS Version: 2.4.26
  	
  	use the default configuration for this OS? (yes/no): yes
  	 >>> configuration (default.linux) has been pushed.
  	 >>> scanning process was started on host: trinity
  	osiris-4.0.1-release:

Com o comando abaixo "databases trinity" verificamos se a base para o host client trinity foi criada corretamente.

  	osiris-4.0.1-release: databases trinity
  	This may take a while...
  	
  	  [ name ]                        [ created ]
  	
  	  * 1                               Sun Aug 29 09:26:27
  	
  	total: 1
  	(*) denotes the base database for this host.
  	
  	osiris-4.0.1-release:

Note que abaixo de "[ created ]" esta a data em que a base foi gerada, se você ver "(incomplete)" é porque a base ainda esta sendo gerada. Aguarde alguns segundos e verifique novamente até que apareça a data. Vamos agora selecionar o host "trinity" para podermos analisa-lo da seguinte forma.

  	osiris-4.0.1-release: host trinity
  	trinity is alive.
  	osiris-4.0.1-release[trinity]:

Perceba que agora o nome do host aparece no prompt do Osiris. Com o host selecionado podemos executar o comando "list-db" para ver as verificações que já foram efetuadas.

  	osiris-4.0.1-release[trinity]: list-db
  	This may take a while...
  	
  	  [ name ]                        [ created ]
  	
  	  * 1                               Thu Sep  2 11:12:50
  	    2                               Fri Sep  3 09:28:35
  	
  	total: 2
  	(*) denotes the base database for this host.

Note que neste exemplo já temos duas verificações. Para analisarmos detalhadamente utilizaremos o comando "print-db" seguido do "name" da verificação, em nosso exemplo será a "2".

  	osiris-4.0.1-release[trinity]: print-db 2
  	This may take a while...
  	
  	100% [========================================>] 2146304 bytes
  	
  	    h) show database header.
  	    r) list file records.
  	    d) list file record details.
  	    s) list system records.
  	    x) list errors.
  	    q) quit
  	
  	[trinity:database: 2]:

O prompt foi alterado novamente para identificarmos facilmente que estamos analisando a base "2" do host "trinity". As diversas opções podem ser acessadas pela letra que precede o item, para economizar tempo vamos direto para a última para voltar ao prompt anterior.

  	[trinity:database: 2]: q
  	osiris-4.0.1-release[trinity]:

Mas se eu quiser saber as modificações que se ocorreram nos arquivos? Basta ver os logs da seguitne forma.

  	osiris-4.0.1-release[trinity]: list-logs
  	This may take a while...
  	
  	  [ name ]                        [ date ]
  	
  	    log.temp                        Fri Sep  3 09:46:28
  	
  	total: 1
  	
  	osiris-4.0.1-release[trinity]: print-log log.temp
  	
  	-------- begin log file --------
  	
  	     compare time: Fri Sep  3 09:46:28 2004
  		     host: trinity
  	      scan config: default.linux (9e115472)
  		 log file: no log file generated, see system log.
  	    base database: 1
  	 compare database: 2
  	
  	[204][trinity][cmp][/boot/boot_message.txt][checksum][6fb775e855c776c4af514fecc7d22ee2cc0167ab,c3d549bfe6106701d64515b9f326764a6db65494]
  	[211][trinity][cmp][/boot/boot_message.txt][mtime][Sun Aug 29 11:54:43 2004,Fri Sep  3 09:45:06 2004]
  	[213][trinity][cmp][/boot/boot_message.txt][ctime][Sun Aug 29 11:54:43 2004,Fri Sep  3 09:45:06 2004]
  	[215][trinity][cmp][/boot/boot_message.txt][bytes][179,187]
  	
  	
  	Change Statistics:
  	----------------------------------
  	
  	        checksums: 1
  	       SUID files: 0
  	 root-owned files: 1
  	 file permissions: 0
  	              new: 0
  	          missing: 0
  	
  	total differences: 4
  	
  	
  	--------  end log file  --------
  	
  	osiris-4.0.1-release[trinity]:

Pronto! Agora você já esta apto a usar o básico do Osiris, neste exemplo usamos a configuração padrão para a verificação dos arquivos. Este arquivo de configuração fica em /usr/local/osiris/configs/default.linux. Se você pretender personalizar essa configuração acesse o site do Osiris e veja nas documentações a descrição das diretivas deste arquivo.

Conclusão

Ao contrário do Samhain o Osiris atendeu a todas as minhas espectativas e o melhor, funcionou 100% (exceto o bug do script de inicialização). Ninguém é perfeito! Não tem muito o que falar, o software fala por si mesmo. Simplesmente ele faz o que promete fazer.

Referências

- http://osiris.shmoo.com

- http://la-samhna.de/samhain/

- http://www.google.com.br


Dúvidas, críticas e sugestões devem ser enviadas para ricardo.iramar@gmail.com.

Quer saber mais um pouco sobre o autor desta documentação? Acesse minha home page em http://ricardo-iramar.com.