Claudio Borges

Technical blog about Linux, BSD, Mac OS X, Games and etc.

Archive for the ‘Debian’ tag

Instalando e configurando o Pure-FTPD

without comments

Como prometido, estou migrando mais um artigo do meu antigo site e agora é a vez do Pure-FTPD.

O Pure-FTP usa a licença (BSD) e é baseado no Troll-FTPd. Seu foco está na eficiência e na facilidade de utilização. É um excelente servidor de ftp, tanto para pequenas aplicações, quanto para provedores de hospedagem. Ele tem suporte a quase todos os tipos de autenticação: LDAP, MySQL, PostgreSQL, unix users e também tem um sistema de autenticação próprio. Em nossa instalação vamos usá-lo com suporte a MySQL.

Vamos começar instalando o Pure-FTPD e o pwgen, este segundo será utilizado para gerar uma senha randômica, pois se você é como eu e tem dificuldade para gerar senhas complexas, sabe do que estou falando. Como esta instalação é baseada em Debian, vamos ao famoso apt:

apt-get install -y pure-ftpd-mysql pwgen

Altere o arquivo /etc/default/pure-ftpd-common pois iremos utilizar o servidor via daemon em vez de inetd, o sed abaixo resolve este problema:

sed -i.default 's/^\(STANDALONE_OR_INETD=\)\(.*\)/\1standalone/' /etc/default/pure-ftpd-common

Com o Pure-FTPD instalado, vamos as configurações. Não vou entrar em detalhes para que serve cada feature, caso precise, digite man pure-ftpd. Continuando, digite as seguintes linhas para configurar todas as opções que iremos utilizar:

for FILE in AllowAnonymousFXP AllowUserFXP AnonymousCanCreateDirs \
        AnonymousOnly AutoRename BrokenClientsCompatibility DisplayDotFiles \
        ProhibitDotFilesRead ProhibitDotFilesWrite VerboseLog; do
        echo no > /etc/pure-ftpd/conf/${FILE}
done

for FILE in AnonymousCantUpload AntiWarez ChrootEveryone CreateHomeDir \
        CustomerProof Daemonize DontResolve; do
        echo yes > /etc/pure-ftpd/conf/${FILE}
done

echo "2000 8" > /etc/pure-ftpd/conf/LimitRecursion
echo 50 > /etc/pure-ftpd/conf/MaxClientsNumber
echo 20 > /etc/pure-ftpd/conf/MaxClientsPerIP
echo 95 > /etc/pure-ftpd/conf/MaxDiskUsage
echo 15 > /etc/pure-ftpd/conf/MaxIdleTime
echo 4 > /etc/pure-ftpd/conf/MaxLoad
echo ftp > /etc/pure-ftpd/conf/SyslogFacility
echo "133 022" > /etc/pure-ftpd/conf/Umask

Crie o usuário e grupo sob o qual todos os usuários virtuais irão rodar:

groupadd -g 2000 ftp
useradd -u 2000 -g ftp -s /sbin/nologin ftp

Renomeie o arquivo /etc/pure-ftpd/db/mysql.conf para /etc/pure-ftpd/db/mysql.conf.default:

mv /etc/pure-ftpd/db/mysql.conf /etc/pure-ftpd/db/mysql.conf.default

Gere uma senha para ser utilizada no arquivo de configuração do mysql e também quando for dar o grant. Para gerar uma senha de 13 caracteres que contenha letras e números, utilize:

pwgen -n 13 1

Obs: Esta senha será utilizada no passo seguinte.

Antes de criar o arquivo /etc/pure-ftpd/db/mysql.conf você tem que saber se vai utilizar o MySQL local no servidor, se sim, recomendo utilizar socket, ou seja, deixe comentada as opções MYSQLServer e MYSQLPort, caso o Banco esteja em um servidor remoto, descomente-as e comente a opção MYSQLSocket. Não é possível utilizar as duas opções em conjunto. Também lembre de alterar a opção MYSQLPassword e colocar a senha que você criou no passo anterior:

# MySQL server name or IP. Don't define this for unix sockets.
#MYSQLServer    127.0.0.1

# MySQL port. Don't define this if a local unix socket is used.
#MYSQLPort      3306

# Define the location of mysql.sock if the server runs on this host.
MYSQLSocket     /var/run/mysqld/mysqld.sock

# User to bind the server as.
MYSQLUser       pureftpd

# User password. You must have a password.
MYSQLPassword   SENHA GERADA PELO PWGEN

# Database to open.
MYSQLDatabase   pureftpd

# How passwords are stored
# Valid values are : "cleartext", "crypt", "md5" and "password"
# ("password" = MySQL password() function)
# You can also use "any" to try "crypt", "md5" *and* "password"
MYSQLCrypt      any

# Query to execute in order to fetch the password
MYSQLGetPW      SELECT Password FROM users WHERE User="\L" and Status='1'

# Query to execute in order to fetch the system user name or uid
MYSQLGetUID     SELECT Uid FROM users WHERE User="\L" and Status='1'

# Query to execute in order to fetch the system user group or gid
MYSQLGetGID     SELECT Gid FROM users WHERE User="\L" and Status='1'

# Query to execute in order to fetch the home directory
MYSQLGetDir     SELECT Dir FROM users WHERE User="\L" and Status='1'

# Query to get the maximal disk usage (virtual quotas)
# The number should be in Megabytes.
MySQLGetQTASZ   SELECT QuotaSize FROM users WHERE User="\L" and Status='1'

# Bandwidth throttling. The server has to be compiled with throttling
# support. Values are in KB/s .
MySQLGetBandwidthUL     SELECT ULBandwidth FROM users WHERE User="\L" and Status='1'
MySQLGetBandwidthDL     SELECT DLBandwidth FROM users WHERE User="\L" and Status='1'

Mude a permissão do arquivo para 0600:

chmod 0600 /etc/pure-ftpd/db/mysql.conf

Conecte no MySQL e execute os comandos abaixo, lembrando de alterar a senha para a senha que foi gerada pelo pwgen:

CREATE DATABASE pureftpd;
USE pureftpd;

CREATE TABLE users (
  id int(32) unsigned NOT NULL auto_increment,
  User varchar(16) NOT NULL default '',
  Password varchar(64) NOT NULL default '',
  Uid varchar(11) default '2000',
  Gid varchar(11) default '2000',
  Dir varchar(128) NOT NULL default '',
  QuotaSize smallint(5) NOT NULL default '0',
  ULBandwidth smallint(5) NOT NULL default '0',
  DLBandwidth smallint(5) NOT NULL default '0',
  Status enum('0','1') NOT NULL default '1',
  Clearpass varchar(128) default '',
  PRIMARY KEY  (`id`,`User`),
  UNIQUE KEY `User` (`User`)
) ENGINE=MyISAM AUTO_INCREMENT=13 DEFAULT CHARSET=latin1;

GRANT ALL PRIVILEGES ON pureftpd.* to 'pureftpd'@'localhost' identified by 'SENHA GERADA PELO PWGEN';

FLUSH PRIVILEGES;

Antes de inserir algum usuário no banco de dados, veja os campos e cada opção que você pode utilizar:

User - Nome do usuário.
Password - Password do usuário encriptado com MD5. 
Dir - Diretório home do usuário. 
QuotaSize - Quota do usuário em MB. 0 é ilimitado.
ULBandwidth - Limita o Upload do usuário em KB, muito útil para preservar o link do servidor. 0 é ilimitado 
DLBandwidth - Similar ao anterior, só que este aqui é para download. 0 é ilimitado.
Status - Os valores aqui dizem se a conta do usuário está ou não ativada. 1 = ativada e 0 = desativada. 
Clearpass - senha do usuario sem encriptar. Este campo muito útil, caso o usuário perca sua senha, você não precisa ficar alterando.

Para inserir um usuário de teste, conecte no MySQL e digite:

USE pureftpd;

INSERT INTO users VALUES (NULL, 'teste', MD5('teste123'), NULL, NULL, '/home/teste', 0, 0, 0, 1, 'teste123');

Com isto basta startar seu Pure-FTPD com o comando:

/etc/init.d/pure-ftpd-mysql start

Prontinho, seu servidor de FTP no ar com toda a segurança de não ter usuário no /etc/passwd.

Uma dica para ver quem está logado no seu FTP, é utilizar o comando pure-ftpwho, com ele você consegue ver quais usuários estão logados no sistema, qual o ip, etc.

Written by but3k4

April 5th, 2010 at 9:16 pm

Posted in Linux

Tagged with , ,

Configurando um servidor de openvpn parte 2

with 2 comments

Dando continuidade a parte 1 do artigo, vamos configurar o lado do cliente.

Chaves e certificados para a filial

server:~/easy-rsa# ./build-key filial1
Generating a 2048 bit RSA private key
......................+++
..........+++
writing new private key to 'filial1.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [BR]:
State or Province Name (full name) [SP]:
Locality Name (eg, city) [Sao Paulo]:"Sao Paulo"
Organization Name (eg, company) [Personal OpenVPN Client]:
Organizational Unit Name (eg, section) []: POC
Common Name (eg, your name or your server's hostname) []:filial1
Email Address [but3k4@gmail.com]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /root/easy-rsa/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           : PRINTABLE:'BR'
stateOrProvinceName   : PRINTABLE:'SP'
localityName          : T61STRING:'"Sao Paulo"'
organizationName      : PRINTABLE:'Personal OpenVPN Client'
organizationalUnitName: PRINTABLE:'POC'
commonName            : PRINTABLE:'filial1'
emailAddress          : IA5STRING:'but3k4@gmail.com'
Certificate is to be certified until Aug  9 14:59:05 2018 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
server:~/easy-rsa# 

Com os certificados criados, vamos copiá-los para o /etc/openvpn:

server:~/easy-rsa# mkdir /etc/openvpn/{certs,ccd,keys}
server:~/easy-rsa# cp keys/*.crt /etc/openvpn/certs/
server:~/easy-rsa# cp keys/*.key keys/dh2048.pem /etc/openvpn/keys/

Criando o arquivo de rotas

O arquivo /etc/openvpn/ccd/filial1 é responsável por definir rotas individuais para os clientes, ou seja, sem ele, o servidor nao vai saber que as maquinas de ambos os lados querem se comunicar e com isso a comunicação fica restrita apenas aos servidores.

server:~/easy-rsa# echo "iroute 192.168.1.0 255.255.255.0" > /etc/openvpn/ccd/filial1

Ajustando as permissões de arquivos / diretórios

server:~/easy-rsa# cd /etc/openvpn/
server:/etc/openvpn# chown -R nobody:nogroup keys certs ccd
server:/etc/openvpn# chmod 0400 keys/* certs/* ccd/*

Criando o diretorio de log

Precisamos criar o diretório de log, pois nossa configuração salva estas informações em arquivos específicos

server:/etc/openvpn# mkdir /var/log/openvpn

Startando o openvpn do lado matriz

server:/etc/openvpn# /etc/init.d/openvpn start
Starting virtual private network daemon: openvpn(OK).
server:/etc/openvpn#

Com o lado do servidor ok, vamos criar os arquivos para a filial:

server:/etc/openvpn# mkdir -p filial1/{certs,keys}
server:/etc/openvpn# cp certs/{ca.crt,filial1.crt} filial1/certs/
server:/etc/openvpn# cp keys/{filial1.key,shared.key} filial1/keys/

Criando o arquivo /etc/openvpn/filial1/openvpn.conf:

# /etc/openvpn/openvpn.conf filial configuration file

# diretorio onde esta os arquivos de configuracao / certificados
cd /etc/openvpn

# Especifica que este certificado eh de um cliente
client

# Define o ip do servidor para o cliente conectar
remote	189.47.25.20

# porta usada para os clientes conectarem no servidor
port	1194

# protocolo usado na conexao
proto	udp

# device usado pelo openvpn
dev	tun

# Diz que o certificado foi assinado pelo servidor
ns-cert-type	server

# Habilita conexoes tls
# Ajuda a bloquear ataques DoS e flooding na porta usada pelo openvpn
tls-client

# arquivo de chave compartilhada usado pelo tls-server
# O mesmo adiciona uma camada a mais de seguranca, habilitando controle de conexoes tls
tls-auth	keys/shared.key 1

# Certificado de autoridade
# Tem que ser o mesmo em todos os hosts
# que conectarem a sua vpn
ca	certs/ca.crt

# Certificado e chave privada do servidor
# Cada maquina tem que ter seu certificado e chave
cert	certs/filial1.crt
key	keys/filial1.key

# Habilita ping de 10 em 10 segundos para dizer ao lado da filial que a matriz
# esta no ar, usado para manter a conexao ativa
ping-timer-rem
keepalive 10 120

# Tipo de criptografia usada
cipher	DES-EDE3-CBC

# habilita compressão no link VPN
comp-lzo

# Ativa a opcao de se conectar, caso o cliente nao esteja na internet, ou
# o mesmo tenha perdido a conexao.
resolv-retry	infinite

# Nao especifica uma porta local para o cliente ouvir.
nobind

# usuário e grupo sob o qual o openvpn ira rodar
user	nobody
group	nogroup

# Permite um restart sem fechar a conexão e re-ler as chaves
persist-key
persist-tun

# Log de status das conexoes
status	/var/log/openvpn/openvpn-status.log

# define um arquivo de log, pois o default é o /var/log/syslog
log	/var/log/openvpn/openvpn.log
log-append	/var/log/openvpn/openvpn.log

# Nivel de log
# 0 silencioso, exceto para erros fatais
# 4 razoavel para uso geral
# 5 e 6 podem ajudar a debugar problemas de conexoes
# 9 maximo debug, muito util para tentar descobrir erros caso a vpn nao suba
verb	3

# desabilita mensagens repetitivas, ou seja, erros ou conexoes em sequencia
# acima de 20, ele dropa.
mute	20

Compactando os arquivos para a filial:

server:/etc/openvpn# tar -czpf filial1.tar.gz filial1

Envie o arquivo filial1.tar.gz para o /tmp/ da filial.

Agora do lado da filial, é necessário instalar o openvpn e descompactar os arquivos:

filial1:~# apt-get install -y openvpn

Com o openvpn instalado, edite o arquivo /etc/default/openvpn e descomente a linha #AUTOSTART=”all”. Agora descompacte o arquivo filial1.tar.gz que está no /tmp/:

filial1:~# cd /tmp/
filial1:~# tar xzf filial1.tar.gz
filial1:~# mv filial1/* /etc/openvpn/
filial1:~# rm -rf /tmp/filial1*

Criando o diretorio /var/log/openvpn:

filial1:/etc/openvpn# mkdir /var/log/openvpn

Startando o openvpn do lado filial:

filial1:/etc/openvpn# /etc/init.d/openvpn start
Starting virtual private network daemon: openvpn(OK).
filial1:/etc/openvpn#

Pronto, seu openvpn esta instalado e matriz/filial estao se comunicando. Não esqueça de liberar no fw da matriz a porta 1194 udp de sua interface externa e tudo na interface da vpn que é tun0.

Caso necessite configurar um notebook para acessar o servidor, basta seguir os passos da criação das configurações para a filial, alterando é claro o nome de filial para notebook ou qualquer outro nome.

Abraços.

Written by but3k4

January 29th, 2010 at 10:45 pm

Posted in Linux

Tagged with ,

Configurando um servidor de openvpn parte 1

with 8 comments

OpenVPN é um solução completa de VPN. A mesma utiliza SSL para encriptar o tráfego, possui versões para os mais diversos sistemas, tais como: Linux, Todos os BSDs e derivados (isto inclui o Mac OS X e Solaris), Windows 2000/XP/2K3/Vista/7 e sua licença é GPL.

Uma de suas principais vantagens é que você pode trabalhar com qualquer porta tcp/udp, além de poder utilizá-la através de nat. Sua configuração é simples e intuitiva e não necessita de aplicação de patch no kernel.

Este artigo é baseado em debian, mas caso queira, os procedimentos de configuração se aplicam tanto para linux quanto para os bsd, levando em conta claro parâmentos como interface, usuário, grupo e arquivos de log.

Primeiramente vamos definir alguns valores que serão utilizados no decorrer deste artigo:

IP Externo da matriz: 189.47.25.20
Rede interna da Matriz: 192.168.0.0/24
Rede interna da filial: 192.168.1.0/24
Interface da vpn: tun0

A instalação do openvpn é bem simples, quem está acostumado com debian bastar utilizar o apt:

server:~# apt-get install -y openvpn

Com o openvpn instalado, edite o arquivo /etc/default/openvpn e descomente a linha #AUTOSTART=”all”.

Copie o diretório /usr/share/doc/openvpn/examples/easy-rsa para o seu /root/:

server:~# cp -a /usr/share/doc/openvpn/examples/easy-rsa /root/

Edite o arquivo /root/easy-rsa/vars e altere as variáveis a seu gosto:

export KEY_SIZE=2048

export KEY_COUNTRY=BR
export KEY_PROVINCE=SP
export KEY_CITY="Sao Paulo"
export KEY_ORG="Personal OpenVPN Server"
export KEY_ORGNAME="POS"
export KEY_EMAIL="but3k4@gmail.com"

Carregue as variáveis no ambiente:

server:~# cd easy-ca
server:~/easy-rsa# . ./vars
NOTE: when you run ./clean-all, I will be doing a rm -rf on /root/easy-rsa/keys

Obs: é . ./ mesmo.

Rode o comando clean-all:

server:~/easy-rsa# ./clean-all

Gerando os certificados e chaves:

Certificado de autoridade (CA). Você irá verificar que os valores estão pré-estabelecidos, faltando apenas o Organizational Unit Name e Common Name:

server:~/easy-rsa# ./build-ca
Generating a 2048 bit RSA private key
.................................................+++
...............................................+++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [BR]:
State or Province Name (full name) [SP]:
Locality Name (eg, city) [Sao Paulo]:
Organization Name (eg, company) [Personal OpenVPN Server]:
Organizational Unit Name (eg, section) []:POS
Common Name (eg, your name or your server's hostname) []:server
Email Address [but3k4@gmail.com]:
server:~/easy-rsa#

Chaves e certificados do servidor

server:~/easy-rsa# ./build-key-server server
Generating a 2048 bit RSA private key
............................................................................+++
..............+++
writing new private key to 'server.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [BR]:
State or Province Name (full name) [SP]:
Locality Name (eg, city) [Sao Paulo]:
Organization Name (eg, company) [Personal OpenVPN Server]:
Organizational Unit Name (eg, section) []:POS
Common Name (eg, your name or your server's hostname) []:server
Email Address [but3k4@gmail.com]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /root/easy-rsa/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           : PRINTABLE:'BR'
stateOrProvinceName   : PRINTABLE:'SP'
localityName          : PRINTABLE:'Sao Paulo'
organizationName      : PRINTABLE:'Personal OpenVPN Server'
organizationalUnitName: PRINTABLE:'POS'
commonName            : PRINTABLE:'server'
emailAddress          : IA5STRING:'but3k4@gmail.com'
Certificate is to be certified until Aug  9 14:41:55 2018 GMT (3650 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
server:~/easy-rsa#

Parâmetros Diffie Hellman

Os parâmetros Diffie Hellman são utilizados para a troca encriptada de informações

server:~/easy-rsa# ./build-dh 
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time

....... e espere pois isso pode demorar ........

server:~/easy-rsa#

Chave compartilhada

Criando uma chave compartilhada para servir de tls:

server:~/easy-rsa# openvpn --genkey --secret keys/shared.key
server:~/easy-rsa#

Criando o /etc/openvpn/openvpn.conf:

# /etc/openvpn/openvpn.conf matriz configuration file

# diretorio onde esta os arquivos de configuracao / certificados
cd /etc/openvpn

# porta usada para os clientes conectarem no servidor
port	1194

# protocolo usado na conexao
proto	udp

# device usado pelo openvpn
dev	tun

# Habilita conexoes tls
# Ajuda a bloquear ataques DoS e flooding na porta usada pelo openvpn
tls-server

# arquivo de chave compartilhada usado pelo tls-server
# O mesmo adiciona uma camada a mais de seguranca, habilitando controle de conexoes tls
tls-auth	keys/shared.key 0

# Certificado de autoridade
# Tem que ser o mesmo em todos os hosts
# que conectarem a sua vpn
ca	certs/ca.crt

# Certificado e chave privada do servidor
# Cada maquina tem que ter seu certificado e chave
cert	certs/server.crt
key	keys/server.key

# Parametros Diffie-Hellman
dh	keys/dh2048.pem

# Rede usada pelo tunel openvpn
server	10.8.0.0 255.255.255.0

# define o arquivo onde sera guardados os ips que os clientes
# obtiverem na conexao, assim os mesmos sempre irao pegar os 
# mesmos ips
ifconfig-pool-persist	ipp.txt

# define o diretorio onde irao ficar as configuracoes individuais para cada
# cliente, assim você podera habilitar as duas redes se comunicarem.
client-config-dir	ccd

# Define a rota para a rede da matriz poder enxergar a rede da filial
route 192.168.1.0 255.255.255.0

# Define a rota para a rede da filial poder enxergar a rede da matriz
push "route-delay 2 600"
push "route 192.168.0.0 255.255.255.0"

# Aceita os clientes se comunicarem entre si sem a necessidade de um outro tunnel
client-to-client

# Habilita ping de 10 em 10 segundos para dizer ao lado da filial que a matriz
# esta no ar, usado para manter a conexao ativa
ping-timer-rem
keepalive 10 120

# Tipo de criptografia usada
cipher	DES-EDE3-CBC

# habilita compressão no link VPN
comp-lzo

# Numero maximo de clientes (filiais)
max-clients	10

# usuário e grupo sob o qual o openvpn ira rodar
user	nobody
group	nogroup

# Permite um restart sem fechar a conexão e re-ler as chaves
persist-key
persist-tun

# Log de status das conexoes
status	/var/log/openvpn/status.log

# define um arquivo de log, pois o default é o /var/log/syslog
log	/var/log/openvpn/openvpn.log
log-append	/var/log/openvpn/openvpn.log

# Nivel de log
# 0 silencioso, exceto para erros fatais
# 4 razoavel para uso geral
# 5 e 6 podem ajudar a debugar problemas de conexoes
# 9 maximo debug, muito util para tentar descobrir erros caso a vpn nao suba
verb	3

# desabilita mensagens repetitivas, ou seja, erros ou conexoes em sequencia
# acima de 20, ele dropa.
mute	20

Por hoje acho que está bom, na parte 2 do artigo irei mostrar como configurar o client e fazer os ajustes finais para você ter um servidor openvpn que atenda matriz, filial e clientes remotos pelo Brasil a fora.

Written by but3k4

January 10th, 2010 at 8:22 pm

Posted in Linux

Tagged with , , ,