Autor: David Barbeiro
Data: 29 de Janeiro de 2003.
Este artigo trata de como pôr a ponto a segurança de nosso grande amado FreeBSD.
O primeiro que faremos é mudar o tipo de cifrado por um muito mais seguro, e implementar uma boa política de contraseñas.
Para isso temos que editar o arquivo /etc/login.conf
hellen# vi /etc/login.conf
Temos que procurar a linha
default:\
:passwd_format=md5:\
e modificá-la para que fique da seguinte maneira:
default:\
:passwd_format=blf:\
Com esta mudança o que estamos fazendo é mudar o sistema de cifrado de contraseñas MD5 por um sistema de cifrado Blowfish muito mais seguro.
Outra mudança que deveríamos realizar é pôr um mínimo de carateres para cada contraseña e fazer que cada usuário mude seu contraseña cada X dias, Para isso poremos o seguinte ao final do apartado default:\
:umask=022:\ :minpasswordlen=8:\ :passwordtime=30d:\
Com isto o que estamos fazendo é obrigar a que a contraseña tenha um mínimo de 8 carateres e que seja obligarorio mudá-la antes de 30 dias. Isto influencia em todos os usuários do sistema, mas nós queremos que o usuário root tenha um minimo de 11 carateres, pelo que nos vamos à seção root:\ e fazemos que fique da seguinte forma:
root:\ :ignorenologin:\ :minpasswordlen=11:\ :tc=default:
Com isto o que estamos fazendo é forçar a contraseña de root a um mínimo de 11 carateres.
Uma vez realizados estas mudanças, temos que lhe dizer ao sistema que refaça a base de dados do sistema de contraseñas, isto o fazemos com a ordem cap_mkdb da seguinte maneira:
hellen# cap_mkdb /etc/login.conf
Uma vez executado o comando para atualizar o sistema de contraseñas só nos ficaria mudar a contraseña para que o sistema a cifre com Blowfish, procedemos a isso:
login: sico Password: passwd Changing local password for sico. Old password: New password: Please enter a password at least 8 characters in length. New password: Retype new password: passwd: updating the database... passwd: done
Já temos visto que funciona corretamente, agora só nos fica com o usuário root, precedemos a isso:
seu Password: passwd root Changing local password for root. New password: Please enter a password at least 11 characters in length. New password: Retype new password: passwd: updating the database... passwd: done
Uma última mudança mais, fica-nos modificar um arquivo para do que quando dêmos de alta um novo usuário no sistema a contraseña se cibre com Blowfish, este achivo é /etc/auth.conf e no há que procurar a linha
# crypt_default = md5 dês
e substituí-la por:
crypt_default = blf
Bem, com isto terminámos a parte das contraseñas.
O primeiro que temos que fazer é configurar o servo ssh para que só aceite conexões pelo protocolo 2 que é bastante mas seguro que o protocolo 1, para o qual temos que editar o arquivo /etc/ssh/sshd_config
vi /etc/ssh/sshd_config
No qual procurámos as seguinte línas:
#Port 22 #Protocol 1 2 #ListenAddress 0.0.0.0 #Banner /some/path
E as substituímos por:
Port 22 Protocol 2 ListenAddress 192.168.10.1 Banner /etc/ssh/banner
A explicação destas mudanças são muito singelos, Port nos indica o porto pelo qual os clientes vão conectar. Protocol nos indica o protocolo que vamos usar, nós elegemos o protocolo 2 por que é muito mais seguro. ListenAddress indica a ip do cartão de rede pela que queremos que escute, 192.168.10.1 é um exemplo que teria que substituir pela vossa IP. E por ultimo Banner que realmente não é uma opção de segurança, mas se o é de advertência, quando o cliente se conecta ao servo, este pondra o banner antes de poder loguearse em nossa máquina.
Como seguramente /etc/ssh/banner não exista o teremos que criar, este é o conteúdo que tenho eu:
hellen# cat /etc/ssh/banner ************************************************************************ This is a private system!!! All connection attempts are logged and monitored. All unauthorized connection attempts will be investigated and handed over to the proper authorities. ************************************************************************ hellen#
Uma vez que já teneis o banner já temos quase configurado o servo ssh, só nos faltaria decidir que usuários podem conectar por SSH a nossa máquina. Dentro desta situação temos duas possibilidades, Filtrar pela IP do cliente, ou filtrar por Usuário, A primeira Opção muitas vezes não é possível já que temos que ter um firewall instalado na máquina e ademas disto, muitos clientes utilizam conexões por rtb (Modem Analógico em Linha analógica) nas quais não dispõem de IP fixa e cada conexão têm uma diferente, asi que vamos filtrar por Usuários.
A opção para filtrar por usuários é muito fácil, é AllowUsers e tambien há que a pôr dentro de etc //ssh/sshd_config
Uma vez decididos que usuários vão poder conectar, vamos configurá-lo
hellen# echo AllowUser [email protected] syvic toni >> /etc/ssh/sshd_config hellen# cat /etc/ssh/sshd_config Port 22 Protocol 2 ListenAddress 192.168.10.1 ... ... # override default of não subsystems Subsystem sftp /usr/libexec/sftp-server AllowUsers [email protected] syvic toni hellen#
Como veis adicionei a três usuários, o primeiro a sico que ademas lhe disse desde que IP pode conectar, é dizer, sico podria conectar desde 192.168.10.2 e despues pus aos usuários syvic e toni que podem conectar desde qualquer lugar.
A segurança é Consola é bastante importante já que álguien poderia arrancar nossa máquina em modo macaco-usuário e trastear nela com privilégios de root, ou simplesmente podriamos deixar uma consola com uma sessão iniciada e ausentar-nos e álguien poderia usar nossa sessão para fazer algo que a ninguém nos gostasse.
Primeiro vamos configurar o sistema para que se arranca em modo macaco-usuário nos peça as contraseña de root para poder usar a máaquina. Para isso temos que editar o arquivo /etc/ttys e localizar a linha que põe:
console none unknown off secure
Esta linha temos que a modificar dejandola da seguinte maneira.
console none unknown off insecure
Desta maneira ninguém que não possua a contraseña de root podra iniciar sessão se arranca a máquina em modo macaco-usuário.
Uma vez que temos o modo macaco-usuário vamos explicar como bloquear uma consola por se nos temos que ausentar da máquina e não podemos fechar a sessão.
Para bloquear a sessão dispomos de uma ordem do próprio sistema, esta ordem se chama lock e bloqueia a consola na que estejamos trabalhando, por defeito a bloqueia durante 15 minutos, mas podemos indicar-lhe que este mais tempo executando lock -n, outra peculiaridade que tem esta ordem é que te pede que ponhas uma contraseña que não tem nada que ver com a do sistema, mas se preferes usar a contraseña sistema podes executar o comando lock -p
hellen# lock Key: Again: lock: /dev/ttyp0 root timeout in 15 minutes time now is Thu Jan 30 03:00:34 CET 2003 Key:
Ainda que eu pessoalmente prefiro usar vlock que ainda que não se encontra na base do sistema está nos ports e seu uso é muito fácil.
hellen# cd /usr/ports/security/vlock && make install clean
Uma vez instalado seu funcionamento é muito fácil, simplesmente se executa vlock e temos bloqueada a consola na que nos encontremos, tambien se pode usar vlock -a e bloqueariamos todas as consolas.
hellen# vlock -a The entire console display is now completely locked. You will not be able to switch to another virtual console. Please enter the password to unlock. root's password:
Isto é todo na seção sobre Consolas.
O primeiro que temos que saber é que quando instalamos o sistema por defeito costumamos arrancar serviços que realmente não usamos, pelo que vamos ir localizando e fechando estes serviços que mas de uma vez podem comprometer nosso sistema.
Vamos começar usando a ordem sockstat -4 o qual vai dizer-nos que portos temos abertos.
hellen# sockstat -4 USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS root sshd 873 3 tcp4 *:22 *:* root inetd 92 4 tcp4 *:21 *:* root syslogd 77 4 udp4 *:514 *:* root X_SERV 234 4 tcp4 *:6000 *:* root sendmail 92 4 tcp4 *:25 *:* root submission 245 4 tcp4 *:587 *:* hellen#
Como veis há certos portos que estão abertos e que realmente não vou usar nunca, é o caso do 587 (Submission), o 25 (SMTP) já que eu não tenho nesta máquina um servo de correio, o 6000 também não vamo-lo usar já que serve para conexões remotas a um servo X-window, o 21 que é o porto do ftp também não vou usá-los, asi que vamos ir fechando portos e assegurando o sistema.
O que vamos fechar primeiro é o porto 6000 já que nós não vamos servir meio grafico a ninguém, para isto precisámos editar o arquivo /usr/X11R6/bin/startx E o calizar a linea
serverargs=""
Modificá-la até que fique da seguinte forma:
serverargs="-nolisten tcp"
Com isto já temos um porto menos aberto, agora vamos fechar o 587 (Submission), este porto não se precisa para mandar nem receber correio, mas pertence ao sendmail, para fechá-lo precisámos editar o arquivo /etc/mail/sendmail.cf e procurar a linha
Ou DaemonPortOptions=Port=587, Name=MSA, M=E
É ta linha há que a comentar para que sendmail não a carregue por defeito.
#Ou DaemonPortOptions=Port=587, Name=MSA, M=E
Agora vamos fechar o porto 25 já que por norma geral os correios no-los descarregámos desde outro servo e não os recebe diretamente minha máquina, pelo que vou fazer que não arranque sendmail.
Para isto precisámos editar o arquivo /etc/rc.conf e adicionar a seguinte linha dependendo da versão de nosso FreeBSD.
Se temos uma versão de FreeBSD inferior a uma 4.6-RELEASE:
sendmail_enable="NÃO"
Se é superior ou Igual a 4.6-RELEASE:
sendmail_enable="NONE"
Em meu exemplo não saiu o porto 111 (sunrpc) mas é muito habitual que este porto saia, para eliminar este porto temos que seguir editando /etc/rc.conf e pôr dentro
nfs_server_enable="NÃO" nfs_client_enable="NÃO" portmap_enable="NÃO"
outro porto dos que temos aberto é o 514 que pertence ao syslogd e esta à espera de poder brindar a oportunidade de logear remotamente, como realmente o que nos interessa é que registre o que ocorre em nossa máquina, vamos pôr o seguinte em etc //rc.conf
syslogd_enable="YES" syslogd_flags="-ss"
Logo por último teniamos aberto o porto 21 que corresponde ao servo ftp, o qual nesta máquina não vai servir-me de nada, pelo que vou-o fechar, como se vê na saída de sockstat -4 estava ejecutandose desde o inetd, asi que vamos cortar o inetd para que não arranque o ftp e outros serviços que não nos interessam, para isso pomos o seguinte em etc //rc.conf
inetd_enable="NÃO"
Agora despues disto só nos fica passar o sistema a monopuesto e voltá-lo a multipuesto para que recargue as variáveis modificadas, outra solução é reiniciar a máquina, eu prefiro passar a monopusuario:
shutdown now
Uma vez que já passámos a multiusuario executamos sockstat -4 e comprovámos que esta a nosso gosto.
hellen# sockstat -4 USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS root sshd 873 3 tcp4 *:22 *:* hellen#
Outra seção acabada ;ou)
Uma vez chegado a este ponto o seguinte que faremos é ativar o acconuting para ter um certo controle sobre os usuários, para fazer isto temos que editar o arquivo /etc/rc.conf e adicionar-lhe a seguinte linha:
accounting_enable="YES"
Para ver as opções que tem a opção de accouting te aconselho ver o manual de sa e de lastcomm
hellen# man sa hellen# man lastcomm
No sistema existe um usuário chamado toor que tem privilégios de root, este usuário nunca se usa, pelo que vamos eliminá-lo para deixar o sistema o mais limpo possível.
hellen# vipw # $FreeBSD: src/etc/master.passwd,v 1.25.2.6 2002/06/30 17:57:17 dês Exp $ # root:$2a$04$i/ou8gD2EdrL8BVw2VXumpuXxXxXxXxXxu0xijdQPPewnWDM2bjr2m:0:0::0:0:Charlie &:/root:/bin/csh toor:*:0:0::0:0:Bourne-again Superuser:/root: daemon:*:1:1::0:0:Owner of many system processes:/root:/sbin/nologin
Como vemos o usuário toor existe, apagamo-lo, e já que estamos vamos tambien a mudar o nome do root que por defeito está posto em Charlie &, para isso deixámos a configuração da seguinte maneira:
# $FreeBSD: src/etc/master.passwd,v 1.25.2.6 2002/06/30 17:57:17 dês Exp $ # root:$2a$04$i/ou8gD2EdrL8BVw2VXumpuXxXxXxXxXxdQPPewnWDM2bjr2m:0:0::0:0:Sico:/root:/bin/csh daemon:*:1:1::0:0:Owner of many system processes:/root:/sbin/nologin
Eu no nome de root pus sico, mas o podeis substituir por vosso nome ou o que querais.
Agora vamos decidir que usuários podem fazer-se root usando a ordem sua, estes usuários para poder usar dita ordem devem estar dentro do grupo wheel, se não o estão não podran fazer-se root.
hellen# vi /etc/group # $FreeBSD: src/etc/group,v 1.19.2.3 2002/06/30 17:57:17 dês Exp $ # wheel:*:0:root daemon:*:1:daemon
Como vemos agora mesmo só está root dentro do grupo, se tentamos fazer-nos root desde um usuário nos dirá o seguinte:
%seu seu: you are not in the correct group (wheel) to seu root. %
Para permitir que nos deixe fazer-nos root devemos deixar a linha da seguinte maneira:
# $FreeBSD: src/etc/group,v 1.19.2.3 2002/06/30 17:57:17 dês Exp $ # wheel:*:0:root,sico daemon:*:1:daemon
Eu decidi que o usuário sico vai poder fazer-se root, guardámos as mudanças e comprovámos que funciona:
hellen:> seu - Password: hellen#
Uma ultima opção para controlar que nenhum usuário mau intencionado possa deixar algun programa nos diretórios temporais é aconsejable pôr em etc //rc.conf a seguinte linha:
clear_tmp_enable="YES"
Bueno, Pois isto é todo, mesmo se podrian introduzir um par de coisas mais para melhorar a segurança, mas as deixar para a futura atualização deste documento.
Espero que vos seja de ajuda. Saúde!