Tunning - Segurança Lógica em FreeBSD

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.

Segurança nas contraseñas

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.

Segurança no servo ssh

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.

Segurança em Consola

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.

Fechando Portos

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)

Segurança com os usuários

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!


"Não o tentes, fá-lo ou não o faças, mas não o tentes"
Hosted by www.Geocities.ws

1