sexta-feira, setembro 29, 2006

Convertendo Pegasus Mail Folder para MailBox Default

Recentemente eu fui questionado sobre sobre a possibilidade
de migrar folder's de um cliente de email chamado Pegasus.

Para os que não sabem do que falo, Pegasus é ou foi um cliente de email
muito comum em redes com servidores Novell Netware, e o fato de migrar
pra mailbox possibilita utilizar esse mailbox em algum servidor de email,
servindo de para uma migração intermediaria pra qualquer outro cliente de email
ou Webmail.

Segue o programa feito em shell script:

[ricardo@ricardo(5:06pm)] ~/scripts# cat pmn2mbx
#!/bin/sh
INFILE="$1"

if [ ! -z $INFILE ];then
mailfolder="$(sed -ne '1p' $INFILE | strings |head -n1)"

sed -e '1{
s/^.*Received/Received/g
s/^.*X-cs: R/X-cs: R/g
}' < $INFILE >"pmn2mbx.XXX"

cp "pmn2mbx.XXX" $INFILE

if grep -q "Received: from SpoolDir by" $INFILE;then
sed -e '/Received: from SpoolDir by/{
i\
From ???@??? Mon Jan 01 00:00:00 1996
}' < $INFILE >"$mailfolder.mbx"
echo "Complete in ${mailfolder}.mbx"
exit 0
else
sed -e '/X-cs: R/{
i\
From ???@??? Mon Jan 01 00:00:00 1996
}' < $INFILE >"$mailfolder.mbx"
echo "Complete in ${mailfolder}.mbx"
exit 0
fi
else
echo "PMN2MBX 1.0"
echo "usage `basename $0`: file.pmn"
exit 64
fi

[ricardo@ricardo(5:06pm)] ~/scripts# ./pmn2mbx
PMN2MBX 1.0
usage ./pmn2mbx: file.pmn

O segredo esta em remover a primeira linha e adicionar um "From" default como "From ???@??? Mon Jan 01 00:00:00 1996"

Qualquer duvida, ja sabem :-)

Protegendo-se de URL Fishing com DnsSpoof !!!

Um sistema implementado por mim que ajudou muito no
controle de Fishing, foi utilizar o DnsSpoof um aplicativo
do pacote Dsniff.

Basicamente basta instalar o dsniff em todos os caches de dns e proxy's,
e utilizar o seguinte script:

#!/bin/sh
INT="em1"
FILE=" /etc/dnsspoof.hosts"
RCF="/etc/rc.conf" # Mode para rc.local no linux
dnsspoof_enable="`grep dnsspoof $RCF |cut -d= -f2`"

case "$1" in
start)
if [ ! -f /var/log/dnsspoof.log ];then
touch /var/log/dnsspoof.log
fi
case "$dnsspoof_enable" in
\"[Yy][Ee][Ss]\")
dnsspoof -i ${INT} -f ${FILE} 1>> /var/log/dnsspoof.log 2>&1 &
echo ' DnsSpoof Start'
;;
*)
echo "Modifique o valor de dnsspoof_enable em $RCF"
;;
esac
;;
stop)
if ! killall -15 dnsspoof 2> /dev/null;then
echo ' Dnspoof not running'
else
echo ' Dnspoof Stop'
fi
;;
restart)
$0 stop
$0 start
;;
rcvar)
echo "dnsspoof_enable=$dnsspoof_enable"
;;
*)
echo "Usage: `basename $0` {start|restart|stop|rcvar}" >&2
;;
esac

exit 0

----
[ricardo@ricardo(4:25pm)] ~/scripts# /usr/local/etc/rc.d/dnsspoof.sh start
DnsSpoof Start
[ricardo@ricardo(4:25pm)] ~/scripts# cat /etc/dnsspoof.hosts
172.16.161.253 www.ocarteirovirtual.front.ru

[ricardo@ricardo(4:28pm)] ~/scripts# dig @200.xxx.xxx.xxx www.ocarteirovirtual.front.ru

; <<>> DiG 8.3 <<>> @200.xxx.xxx.xxx www.ocarteirovirtual.front.ru
; (1 server found)
;; res options: init recurs defnam dnsrch
;; got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUERY SECTION:
;; www.ocarteirovirtual.front.ru, type = A, class = IN

;; ANSWER SECTION:
www.ocarteirovirtual.front.ru . 1M IN A 172.16.161.253 !!!! AQUI !!!!!!

;; Total query time: 4 msec
;; FROM: xxx.xxx.br to SERVER: 200.XXX.XXX.XXX
;; WHEN: Fri Sep 29 16:29:17 2006
;; MSG SIZE sent: 47 rcvd: 63

Depois faça uma pagina explicativa nesse IP,
coloque isso em um banco de dados e
alimente atravez de um interface WEB.

Executando scrips remotamente com GAWK !!

Executar comandos remotamente sem necessitar de senha,
é o sonho de todo hacker e teoricamente o pesadelo de todo
Administrador Unix.

Existem varias maneiras de executar processos remotos, em
muitos preferem usar ssh + chave rsa, que a meu ver
prove mais risco do que solução.

Pensando nisso eu escrevi 2 scripts usando gawk,

O primeiro é o RCSS - Remote Check System Server

#!/usr/local/bin/gawk -f
##
## RCSS -- Remote Check System Server
## Copyright (c) 2005 Ricardo Alves dos Reis <ricardo.areis@gmail.com>
##
## Redistribution and use in source and binary forms, with or without
## modification, are permitted provided that the following conditions
## are met:
## 1. Redistributions of source code must retain the above copyright
## notice, this list of conditions and the following disclaimer.
## 2. Redistributions in binary form must reproduce the above copyright
## notice, this list of conditions and the following disclaimer in the
## documentation and/or other materials provided with the distribution.
##
## THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
## ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
## IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
## ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
## FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
## DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
## OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
## HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
## LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
## OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
## SUCH DAMAGE.
##
function usage( v, s, b, u)
{
v = " -V version -- Server Version"
h = " -h help -- RCSS Help"
s = " -p port -- Server Port"
b = " -b bind -- Bind Address\n"
u = "rcss [options]"
print u > "/dev/stderr"
print "" > "/dev/stderr"
print "Options:" > "/dev/stderr"
print h > "/dev/stderr"
print v > "/dev/stderr"
print s > "/dev/stderr"
print b > "/dev/stderr"
print "Ex. rcss -b 192.168.0.1 -p 8192" > "/dev/stderr"
exit
}
function network()
{
while ((cmd | getline) > 0)
print $0 |& NetService
fflush(NetService)
close(NetService)
fflush()
}
BEGIN {
if ( ARGV[1] == "-h"){
usage()
}
else if ( ARGV[1] == "-V"){
print "CRS Server 1.0 - Check Remote System Server"
exit
}
else if ( ARGV[1] == 0 || ARGV[2] == 0 || ARGV[3] == 0 || ARGV[4] == 0) {
if ( SPORT == 0 ) { SPORT = 6556 }
if ( BIND == 0 ) { BIND = 0 }
}
else if ( ARGV[1] == "-b" ) {
if ( ARGV[2] ~ /[[:digit:]]/ ) {
BIND = ARGV[2]
if ( ARGV[3] == "-p" ) {
if ( ARGV[4] ~ /[[:digit:]]/ ) {
SPORT = ARGV[4]
}
}
}
}
else
usage()
NetService = "/inet/tcp/" SPORT "/" BIND "/0"
NetService |& getline

if ( NF > 2 ) {
exit
}
if ( $1 ~ "1234567890")
cmd = "sh /etc/periodicos/bin/comandos.sh "$2
network()
}

Basicamente este script abre uma porta tcp, por default 6556 e trata
toda a string passada, caso essa tenha mais de 2 colunas
o script continua.

O segundo if garante que para continuar a primeira coluna deve
conter um numero de identificação condizente com "1234567890",
caso isso aconteça a segunda coluna será
passada como argumento para um script em shell comandos.sh.

O meu script comandos.sh é muito extenso, um exemplo basico
do que pode ser feito é:


Uma função loadav_free() que retorna a media de carga do servidor remoto.

loadav_free()
{
OUTPUT=`sysctl vm.loadavg`
outputyesno "$OUTPUT" $PRINT
}


loadav_free $1

Quando repassamos o argumento 2 ou seja "$2" para o script comandos.sh,
este interpreta como argumento 1 ou seja $1.

O segundo é o RCSC - Remote Check System Client:

#!/usr/local/bin/gawk -f
## rcsc -- Remote Check System Client
## Copyright (c) 2005 Ricardo Alves dos Reis < ricardo.areis@gmail.com>
##
## Redistribution and use in source and binary forms, with or without
## modification, are permitted provided that the following conditions
## are met:
## 1. Redistributions of source code must retain the above copyright
## notice, this list of conditions and the following disclaimer.
## 2. Redistributions in binary form must reproduce the above copyright
## notice, this list of conditions and the following disclaimer in the
## documentation and/or other materials provided with the distribution.
##
## THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
## ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
## IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
## ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
## FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
## DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
## OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
## HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
## LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
## OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
## SUCH DAMAGE.
##
function usage( u, v, c, s, p)
{
u = "rcsc [options]"
h = " -h help -- RCSC Help"
v = " -V version -- Program Version"
c = " -c check -- Check Services Number\n\
( [12345] see Server)"
s = " -s server -- CRS Server"
p = " -p port -- RCSS port"
print u > "/dev/stderr"
print "" > "/dev/stderr"
print "Options:" > "/dev/stderr"
print v > "/dev/stderr"
print h > "/dev/stderr"
print s > "/dev/stderr"
print p > "/dev/stderr"
print c > "/dev/stderr"
print "\nEx. rcsc -s 192.168.0.1 -p 8192" > "/dev/stderr"
exit
}
BEGIN {
if ( ARGV[1] == "-V" ){
print "CRS 1.0 - Check Remote System"
exit
}
else if ( ARGV[1] == "-s" ){
if ( ARGV[2] ~ /[[:digit:]]/ ) {
BIND = ARGV[2]
}
if ( ARGV[3] == "-p" ){
if ( ARGV[4] ~ /[[:digit:]]/ ) {
SPORT = ARGV[4]
}
}
if ( ARGV[5] == "-c" ) {
service = ARGV[6]
}
else
usage()
}
else
usage()
NetService = "/inet/tcp/0/" BIND "/"SPORT
print service |& NetService
while ((NetService |& getline) > 0)
print $0
close(NetService)
}

Esse script é básico e a única diferença dele
para um telnet é o caracter terminação adicionado pelo gawk
que indica termino de string.

Testando o script,

[ricardo@ricardo(9:49am)] /ricardo# gawk -f /etc/periodicos/bin/rcsc -s 200.xxx.xxx.xxx -p 6556 -c '1234567890 loadav_free'
vm.loadavg: { 0.53 0.75 0.71 }


Obviamente essa solução torna-se eficaz e realmente segura
com o uso de algum tipo de criptografia, eu normalmente uso com stunnel
o que garante um meio muito mais seguro.

Ja não tenho trabalhado nesses scripts a alguns meses, e sendo assim muitas
coisas só não estão melhores por falta de tempo e estudo.




quinta-feira, setembro 28, 2006

FreeBSD-Update ... rápido, seguro claro que é FreeBSD !!!!

Um dos poucos sistema Unix* que eu conheço,
capas de em poucos segundos fazer atualizações de
segurança no sistema base via Internet de
forma segura, chama-se FreeBSD

freebsd-update é o nome do programa desenvolvido
a  quase 3 anos por Colin Percival, Security Officer do
Projeto FreeBSD.

Recentemente adicionado na base do sistema, já estará
disponível por default na versão mais nova 6.2,
mas a um bom tempo já é possível usar essa maravilha ;-)

Esta disponível pelo ports em security/freebsd-update,

[ricardo@ricardo(8:03am)] uname -r
6.1-SECURITY

Isso indica que o KERNEL, antigo RELEASE já foi
atualizado  via security-update.

Para atualizar a base com as ultimas correções basta,

ricardo@ricardo(8:03am)] freebsd-update fetch
Fetching updates signature...
Fetching hash list signature...
Examining local system...

The following files are affected by security
fixes, but have not been updated because they
have been modified locally:

/lib/libcrypto.so.4
/usr/lib/libcrypto.a
/usr/lib/libcrypto_p.a
/usr/lib/libssl.a
/usr/lib/libssl_p.a
/usr/sbin/lwresd
/usr/sbin/named

Fetching updates...
/etc/rc.d/jail...
/usr/bin/dig...
/usr/bin/gunzip...
/usr/bin/gzcat...
/usr/bin/gzip...
/usr/bin/host...
/usr/bin/nslookup...
/usr/bin/nsupdate...
/usr/bin/openssl...
/usr/bin/zcat...
/usr/include/openssl/dh.h...
/usr/include/openssl/dsa.h...
/usr/include/openssl/rsa.h...
/usr/lib/libssl.so.4...
/usr/libexec/sendmail/sendmail...
/usr/sbin/dnssec-keygen...
/usr/sbin/dnssec-signzone...
/usr/sbin/named-checkconf...
/usr/sbin/named-checkzone...
/usr/sbin/rndc-confgen...
/usr/sbin/ypserv...
Updates fetched

To install these updates, run: '/usr/local/sbin/freebsd-update install'

ricardo@ricardo(8:03am)] freebsd-update install
Backing up /etc/rc.d/jail...
Installing new /etc/rc.d/jail...
Backing up /usr/bin/dig...
Installing new /usr/bin/dig...
Backing up /usr/bin/gunzip...
Installing new /usr/bin/gunzip...
Backing up /usr/bin/gzcat...
Recreating hard link from /usr/bin/gunzip to /usr/bin/gzcat...
Backing up /usr/bin/gzip...
Recreating hard link from /usr/bin/gunzip to /usr/bin/gzip...
Backing up /usr/bin/zcat...
Recreating hard link from /usr/bin/gunzip to /usr/bin/zcat...
Backing up /usr/bin/host...
Installing new /usr/bin/host...
Backing up /usr/bin/nslookup...
Installing new /usr/bin/nslookup...
Backing up /usr/bin/nsupdate...
Installing new /usr/bin/nsupdate...
Backing up /usr/bin/openssl...
Installing new /usr/bin/openssl...
Backing up /usr/include/openssl/dh.h...
Installing new /usr/include/openssl/dh.h...
Backing up /usr/include/openssl/dsa.h...
Installing new /usr/include/openssl/dsa.h...
Backing up /usr/include/openssl/rsa.h...
Installing new /usr/include/openssl/rsa.h...
Backing up /usr/lib/libssl.so.4...
Installing new /usr/lib/libssl.so.4...
Backing up /usr/libexec/sendmail/sendmail...
Installing new /usr/libexec/sendmail/sendmail...
Backing up /usr/sbin/dnssec-keygen...
Installing new /usr/sbin/dnssec-keygen...
Backing up /usr/sbin/dnssec-signzone...
Installing new /usr/sbin/dnssec-signzone...
Backing up /usr/sbin/named-checkconf...
Installing new /usr/sbin/named-checkconf...
Backing up /usr/sbin/named-checkzone...
Installing new /usr/sbin/named-checkzone...
Backing up /usr/sbin/rndc-confgen...
Installing new /usr/sbin/rndc-confgen...
Backing up /usr/sbin/ypserv...
Installing new /usr/sbin/ypserv...

É incrível o que um programa feito em shell script pode fazer !!

Definições ....

Definir metas é sempre um risco,
segue as minhas metas macros
e micros para um futuro não
tão distante.

Todas as datas em tempo corrido,
  • MCSO  - 6 meses
  • Pós-Graduação em Segurança - 1 1/2 anos
  • BS7799 Lead Auditor - 1 ano
  • CISSP - 2 anos
Estou me preparando atualmente para a Certificação da Modulo,
mas com foco na CISSP que a meu ver é um desafio a longo prazo.

Como estou estudando !!
  • Guia Oficial da Modulo para MCSO
  • Política de Segurança da Informação: Guia Prático para Elaboração e Implementação - Editora: Ciência Moderna
  • Manual de Planejamento de Gestão de Riscos Corporativos - Editora: Sicurezza
  • Gerenciamento de Projetos de Tecnologia da Informação - Editora: Campus

quarta-feira, setembro 27, 2006

Tcpdump e P2P !!

As implementações mais recentes do tcpdump,
agora tem como possibilidade filtros com range de
portas e comprimento máximo do pacote.

Agora eu não preciso fazer milágres com shell script e awk :-)

Segue um exemplo:

[ricardo@ricardo(8:16am)] /tmp> tcpdump -nni fddi0 'udp src portrange
1024-65535 and dst portrange 1024-65535 and length <=64'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on fddi0, link-type FDDI (FDDI), capture size 96 bytes
08:47:07.223506 IP 201-35-218-44.bnut3702.dsl.brasiltelecom.net.br.50051 > 172.16.xxx.xxx.34391: UDP, length 13
08:47:07.500728 IP 201-35-218-44.bnut3702.dsl.brasiltelecom.net.br.50051 > 172.16.xxx.xxx.34391: UDP, length 13
08:47:07.676858 IP 201-35-218-44.bnut3702.dsl.brasiltelecom.net.br.50051 > 172.16.xxx.xxx.34391: UDP, length 13
08:47:07.839721 IP 201-35-218-44.bnut3702.dsl.brasiltelecom.net.br.50051 > 172.16.xxx.xxx.34391: UDP, length 13

Duvidas ?

08:48:02.613587 IP 201-35-218-44.bnut3702.dsl.brasiltelecom.net.br.50051 > 172.16.xxx.xxx.34391: UDP, length 13
0x0000: aaaa 0300 0000 0800 4500 0029 552b 0000 ........E..)U+..
0x0010: 7311 ffc7 c923 da2c ac10 a370 c383 8657 s....#.,...p...W
0x0020: 0015 89b4 4460 0001 0000 0000 0001 f500 ....D`..........
0x0030: 00

Agora so falta o snort !!

Como gerar um Unix MAN ?

Essa é sem duvida uma das perguntas mais
freqüentes entre administradores e usuários
de sistemas Unix*.

Existem diversos editores de manual, eu recomendo
por experiência própria o uso do Pod2man.

Pod2man é um script feito em perl, que e distribuído
juntamente com o pacote do perl, e é esse script
que tem a função de gerar todos os manuais do perl.

O Pod2man converte arquivos do tipo pod em manuais,
onde arquivos .pod seguem uma sintaxe, como eu poderia dizer
"Human-readable".

Exemplo de um arquivo ".pod"

[ricardo@ricardo(8:09am)] /tmp> cat blog.pod
=head1 NAME

Blog - Teste pod2man

=head1 SYNOPSIS

blog [te] ...

blog -h

=head1 DESCRIPTION

Como criar um man, usando Perl::Man através do pod2man.

=head1 OPTIONS

B<-t> tenha calma
B<-e> está acabando

=head1 EXAMPLES

Agora ... realmente esta no fim:

=head1 AUTHOR

Ricardo A. Reis ricardo dot areis at gmail dot com>

=head1 SEE ALSO

pod2man(<F4>)


Ao Final é descobrir em qual sessão o man
deve ser inserido, para que o mesmo seja
criado de forma correta.

Executando o próximo comando transformaremos um arquivo .pod
em um man no formato roff.

[ricardo@ricardo(8:09am)] /tmp> pod2man --section=8 --release="27 Setembro 2006"
--center="FreeBSD System Manager's Manual" --date="27 Setembro 2006" blog.pod > blog.8

Para visualizar é necessário passar o arquivo blog.8 pelo comando nroff, algo como:

[ricardo@ricardo(8:09am)] /tmp> nroff -mman blog.8 | more

BLOG(8) FreeBSD System Manager's Manual BLOG(8)

NAME

Blog - Teste pod2man


SYNOPSIS

blog [te] ...

blog -h

DESCRIPTION

Como criar um man, usando Perl::Man através do pod2man.

OPTIONS

-t tenha calma
-e está acabando

EXAMPLES

Agora ... realmente esta no fim:

AUTHOR

Ricardo A. Reis ricardo dot areis at gmail dot com>

SEE ALSO

pod2man(<F4>)


27 Setembro 2006 27 Setembro 2006 BLOG(8)


Pronto temos um man !!

terça-feira, setembro 26, 2006

Rotacioanamento de Log's em um Argus Server.

Todos sabemos o quanto critico e primordial para uma instituição é ter
armazenado em meio seguro, dump's de acesso a Internet.

Uma ferramenta comumentemente usada para esse processo é o Argus Server,

todavia essa ferramenta é incapaz de gerir a função de rotacionamento.

Após configurar o servidor Argus logo você dará conta que uma rede de

pelo menos 32Mbps, gera a quantidade de:

+/- 1.2 Giga de logs binarios por dia * +/- 30 dias

Temos a incrível conta de 30 Gigas de dumps de acesso, em nível de camada 4

Para poder rotacional os logs a cada 30 dias, eu fiz um script em Shell SH

[ricardo@ricardo(8:11pm)] /ftp> cat /root/scripts/arg-rotate.sh
#!/bin/sh
ARGUS_ARCHIVE_PATH="/ftp2/argus/archive"
DATE=`date '+%Y/%m'`
LAST_DATE=`date -v-1m '+%Y/%m'`
ARGUS_MAXDAYS=`cal |egrep . | tail -1 | awk '{ print $(NF) }'`
if [ -d $ARGUS_ARCHIVE_PATH/$LAST_DATE ];then
        LAST_DATE_SIZE=`du -ks  $ARGUS_ARCHIVE_PATH/$LAST_DATE | awk '{ print $1 }' 2>/dev/null`
        if [ $LAST_DATE_SIZE -eq 2 ];then
                rm -rf $ARGUS_ARCHIVE_PATH/$LAST_DATE
        fi
fi
if  [ -d $ARGUS_ARCHIVE_PATH/$LAST_DATE ];then
        ARGUS_ACTDAYS=`ls -1 $ARGUS_ARCHIVE_PATH/$DATE |wc -l`
        ARGUS_ACTDAYS_2=`ls -1 $ARGUS_ARCHIVE_PATH/$LAST_DATE |wc -l`
        NDAYS=`expr $ARGUS_ACTDAYS + $ARGUS_ACTDAYS_2`
        if   [ $NDAYS -ge $ARGUS_MAXDAYS ];then
                DEL_NDAYS=`expr $ARGUS_MAXDAYS - $NDAYS`
                DAYS_TO_DEL=`ls -1 $ARGUS_ARCHIVE_PATH/$LAST_DATE | head $DEL_NDAYS`
                cd $ARGUS_ARCHIVE_PATH/$LAST_DATE ; rm -rf $DAYS_TO_DEL
        fi
else
        ARGUS_ACTDAYS=`ls -1 $ARGUS_ARCHIVE_PATH/$DATE |wc -l`
        if [  $ARGUS_ACTDAYS -ge $ARGUS_MAXDAYS ]; then
                DEL_NDAYS=`expr $ARGUS_MAXDAYS - $ARGUS_ACTDAYS`
                DAYS_TO_DEL=`ls -1 $ARGUS_ARCHIVE_PATH/$DATE | head $DEL_NDAYS`
                cd $ARGUS_ARCHIVE_PATH/$DATE ; rm -rf $DAYS_TO_DEL
        fi
fi

A variável que controla a periodicidade do rotacionalmento e dinâmica no caso de rotacionalmento mensal,
para um intervalo superior a um mes é preciso modificar a variável $ARGUS_MAXDAYS.

Tambem é preciso modificar a variável $ARGUS_ARCHIVE_PATH para o mesmo caminho configurado,
na ferramenta de compactação incluida no Argus Server chamada de argusarchive.

Para adicionar ao cron no FreeBSD, basta adicionar no final do /etc/crontab

#ArgusServer Rotate Mensal
0 0 * * *   root /root/scripts/arg-rotate.sh   >/tmp/arg-rotate.sh 2>&1

Meu primeiro ports ( sysutils/kldfind )

Alguns meses atras escrevi um ports chamado kldfind, que facilita
a busca por KLD no sistema.

[ricardo@ricardo(2:41pm)] /usr/ports/sysutils/kldfind> make install
[ricardo@ricardo(2:41pm)] /usr/ports/sysutils/kldfind> rehash
[ricardo@ricardo(2:43pm)] /usr/ports/sysutils/kldfind> kldfind
usage: kldfind [-qv] -c category ...
          kldfind [-qv] -s string   ...
          kldfind  -h

[ricardo@ricardo(2:43pm)] /usr/ports/sysutils/kldfind> kldfind -h
kldfind Version 0.59
Options:
  -c    --  find all matchs for category
  -s    --  string match
  -v    --  verbose
  -q    --  quiet 

[ricardo@ricardo(2:45pm)] /usr/ports/sysutils/kldfind> kldfind -s star
/boot/kernel/star_saver.ko

[ricardo@ricardo(2:43pm)] /usr/ports/sysutils/kldfind> kldfind -c acpi
/boot/kernel/acpi_asus.ko
/boot/kernel/acpi_fujitsu.ko
/boot/kernel/acpi_ibm.ko
/boot/kernel/acpi_panasonic.ko
/boot/kernel/acpi_sony.ko
/boot/kernel/acpi_toshiba.ko
/boot/kernel/acpi_video.ko

[ricardo@ricardo(2:46pm)] /usr/ports/sysutils/kldfind> kldfind -vc acpi

====>   Search finish, 7 resultes for /boot/kernel

       KLD                          Description
       ---                          -----------

===>   acpi_asus,              --- Asus Laptop Extras
===>   acpi_fujitsu,           --- Fujitsu Laptop Extras
===>   acpi_ibm,               --- ACPI extras driver for IBM laptops
===>   acpi_panasonic,      --- ACPI hotkey driver for Panasonic laptops mdoc ...
===>   acpi_sony,              --- ACPI notebook controller driver for Sony laptops
===>   acpi_toshiba,          --- Toshiba HCI interface
===>   acpi_video,             --- ACPI Video Extensions driver

[ricardo@ricardo(2:49pm)] /usr/ports/sysutils/kldfind> sh -c 'if kldfind -qc security ; then echo EXISTE ; else echo "NAO EXISTE" ; fi'
NAO EXISTE

Claro que esse software é beta  !!

Migrando usuario para o FreeBSD.

Migrar uma base de usuário é sempre um problema a se pensar,
pra resolver esse problema eu estou postando um script bem simples
feito por mim.

[ricardo@ricardo(10:10am)] ~> cat lista_de_usuarios.txt
ricardo|Ricardo dos Santos
luiz|Luiz Gouveia
jose|Jose de Lima
maria|Maria de Almeida

[ricardo@ricardo(10:14am)] ~> cat cria_master.sh
#!/bin/sh
LISTA="lista_de_usuarios.txt"
#modifique as variaveis conforme a necessidade
uid="500"
gid="100"
key=0
OLD_IFS="$IFS"
IFS="|"
while read login user_name;do
HASH_MD5=$(echo ${key}${login} | openssl passwd -1 -stdin)
echo "A senha do usuario $login = ${i}${login}"
echo "${login}:${HASH_MD5}:${uid}:${gid}::0:0:${user_name}:/home/${login}:/bin/csh"
echo mkdir /home/${login}
key=$(( $key + 2))
uid=$(( $uid + 1 ))
done <$LISTA
IFS=$OLD_IFS

[ricardo@ricardo (10:15am)] ~> sh cria_master.sh
A senha do usuario ricardo = 0ricardo
ricardo:$1$3nCCw4iW$IDKzECHw9iz8BnDLqawwq1:500:100::0:0:Ricardo dos Santos:/home/ricardo:/bin/csh
mkdir /home/ricardo
A senha do usuario luiz = 2luiz
luiz:$1$LMlJcyJ6$XCXEM7jWuD82ZiG3HK6yX1:501:100::0:0:Luiz Gouveia:/home/luiz:/bin/csh
mkdir /home/luiz
A senha do usuario jose = 4jose
jose:$1$2jLOSASd$JoCFpsUAIr9ezgb7ZnztL/:502:100::0:0:Jose de Lima:/home/jose:/bin/csh
mkdir /home/jose
A senha do usuario maria = 6maria
maria:$1$phatUqhg$UuZ8yM7g/k0mMcBa1Cwn20:503:100::0:0:Maria de Almeida:/home/maria:/bin/csh
mkdir /home/maria

Podemos observar que o script busca a base de usuário e seus respectivos nomes,
em uma lista externa aqui chamada lista_de_usuarios.txt.
Utilizando a ferramenta openssl e a função passwd estamos criando hash's MD5 e formatando
a saída no formado default do /etc/master.passwd do FreeBSD.

Obs: Para evitar que uma senha seja facilmente descoberta criei uma variavel ${key}, incrementando a de dois em dois.

Anseios, questionamentos e metas.

Como primeiro post em meu primeiro Blog, achei melhor
falar sobre os meus anseios profissionais de ontem, meus questionamentos
de hoje e minhas metas do amanha.

Nos últimos anos tenho focado a "Excelência Técnica" como a principal
e talvez única fonte de iniciativa profissional.

É provável que a grande paixão por sistemas UNIX* tenha produzido um
leve torpor em meu consciente, e foi talvez por esse magnetismo criado
entre o meu consciente e o console que manipulo diariamente nos últimos
8 anos é que eu tenha me deixado iludir.

O mercado de trabalho é volátil e sendo assim os profissionais
precisam acelerar o metabolismo da mudança, é preciso ver por de traz das
curvas sinuosas e tentar detectar quando a estabilidade não é prejudicial
a natureza evolutiva de cada profissional.

Então para os que gostam de frases, uma de minha própria autoria
"É preciso contrariar a nossa natureza com frequência, isso evita os
vícios frequentes".

E comigo não seria diferente, foi preciso ousar novamente, arriscar outra vez
e sentir a felicidade de entrar de cabeça em um campo totalmente novo .....
“A Gestão de Risco Corporativo” é a bola da vez.

E como eu muitos querem saber, a onde isso vai terminar ?

CISSP pode ser a resposta, mas é provável que o auto conhecimento venha primeiro.