VSFTPD
FTP server s podporou SSL
V dnešní době je samozřejmostí, že většina aplikací používá šifrovanou komunikaci a tak není žádným překvapením, že i vsftpd podporuje protokol SSL respektive TLS, který je dnes upřednostňován. V CentOSu máme ušetřenou práci tím, že RPM balíček v něm obsažený je již kompilován s podporou SSL.
Pro soukromé účely obvykle stačí použít sám sebou ("self signed") podepsaný certifikát, případně certifikát podepsaný vlastní certifikační autoritou. Pro komerční použití je vhodné mít certifikát podepsaný nějakou veřejnou (důvěryhodnou) certifikační autoritou.
Self signed certifikát
Sám sebou podepsaný certifikát (s platností na 10 let) vyrobíme následujícím příkazem:
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \ -keyout /etc/vsftpd/vsftpd.pem -out /etc/vsftpd/vsftpd.pem
V souboru /etc/vsftpd/vsftpd.pem
nalezneme jak soukromý klíč, tak
samotný certifikát. Parametr -nodes
nám zajistí, že nebude
privátní klíč zaheslován. Pokud pro zvýšení bezpečnosti tento parametr
vynecháte, tak to pro vás bude znamenat, že toto zadané heslo privátního klíče
budete muset při
každém restartu démona vsftpd nebo při restartu serveru znovu zadat, což
obvykle vyžaduje být přímo u konzole serveru. Parametr
-days 3650
znamená dobu platnosti certifikátu.
Je dobré nastavit bezpečná práva na tomto souboru s certifikátem, tedy:
chmod 600 /etc/vsftpd/vsftpd.pem
Sám sebou podepsaný certifikát není úplně plnohodnotný a k tomu se staví i
některé klientské aplikace. Například linuxový klient gftp se odmítne se
serverem vsftpd spojit dokud v jeho konfiguraci (gftp) nevypneme
defaultní volbu "Verify SSL Peer". Toto nám však pomůže jen na přihlášení
přes šifrovaný protokol, pokud bychom chtěli i data posílat šifrovaně
(direktiva force_local_data_ssl=YES
), tak se nám to nepovede
a komunikace skončí s chybou:
Invalid response '5' received from server.
Pro podporu SSL nebo lépe TLS ve vsftpd nám stačí přidat do konfiguračního souboru tyto direktivy:
ssl_enable=YES ssl_tlsv1=YES rsa_cert_file=/etc/vsftpd/vsftpd.pem force_local_logins_ssl=YES force_local_data_ssl=NO
Volba ssl_tlsv1=YES
je defaultně zapnutá a je zde uvedena jen
pro informaci. rsa_cert_file
nastavuje cestu k souboru
s certifikátem. Volba force_local_logins_ssl=YES
zařídí, že heslo
pro lokální uživatele je vždy posláno přes SSL. Díky volbě
force_local_data_ssl=NO
budou data přenášena nešifrovaně
a to z důvodů, které jsem v souvislosti s klientem gftp popsal výše.
Certifikát podepsaný vlastní certifikační autoritou
Nejprve si vytvoříme vlastní certifikační autoritu. V CentOSu budeme mít práci
zase trochu ulehčenou díky tomu, že součástí RPM balíčku openssl jsou i skripty
připravené na generování certifikátů. Tyto skripty se nacházeji v adresáři
/usr/share/ssl
a nás bude zajímat podadresář misc
do kterého přejdeme.
Ještě před samotným generováním certifikační autority si můžete upravit
konfigurační soubor /usr/share/ssl/openssl.cnf
a nastavit si zde
především níže uvedené direktivy, což ušetří čas při generování dalších
certifikátů.
countryName_default = CZ stateOrProvinceName_default = Stredocesky kraj localityName_default = Prague 0.organizationName_default = Tachec organizationalUnitName_default = admin
Vlastní certifikační autoritu vytvoříme následujícím příkazem:
cd /usr/share/ssl/misc ./CA -newca
Zadáme heslo a vyplníme všechna potřebná pole. Pole Common Name
není v tomto případě nijak důležité, takže jej nemusíte vyplňovat. Certifikační autoritu a další věci nalezneme v podadresáři demoCA
.
Druhým krokem bude vytvořit žádost o podepsání certifikátu - certifikační
žádost (certificate signing request). Pokud chcete mít certifikát podepsaný
nějakou veřejnou certifikační autoritou, tak můžete tuto vygenerovanou
žádost dané autoritě předat spolu s vašimi údaji, které si ověří a za poplatek
vám vytvoří podepsaný certifikát. Nám postačí, že si certifikační žádost
podepíšeme naší výše vytvořenou certifikační autoritou. Ještě před
vygenerováním certifikační žádosti je dobré udělat pár úprav ve skriptu
CA
. Proměnnou DAYS="-days 365"
je dobré změnit na
DAYS="-days 3650"
, tzn. dobu platnosti certifikátu zvednout
na 10 let. A pokud nechceme heslem zašifrovat soukromý klíč, což by znamenalo
při každém restartu serveru nebo démona vsftpd toto heslo uvést, tak si
změníme řádek:
$REQ -new -keyout newreq.pem -out newreq.pem $DAYS
na
$REQ -new -nodes -keyout newreq.pem -out newreq.pem $DAYS
Certifikační žádost pak můžeme vytvořit následujícím způsobem:
./CA -newreq
Pozor, zde již musíme vyplnit pole Common Name
a mělo by
odpovídat názvu našeho počítače (včetně domény). Žádost o certifikát i
soukromý klíč nalezneme v souboru newreq.pem
.
Posledním krokem je podepsání certifikační žádosti naší certifikační autoritou, což se provede následovně:
./CA -sign
Budete vyzvání k zadání hesla, což je heslo, které jsme nastavovali při
generování certifikační autority a po potvrzení údajů máme hotovo. Certifikát
nalezneme v souboru newcert.pem
.
Informace v certifikátu si můžeme ověřit tímto příkazem:
openssl x509 -in certs/server.crt -noout -text
A to zda je certifkát validní pro autentizaci serveru ověříme jedním z níže uvedených příkazů:
./CA -verify openssl verify -purpose sslserver -CAfile demoCA/cacert.pem newcert.pem
VSFTPD vyžaduje, aby byl soukromý klíč a certifikát v jednom souboru, takže budeme muset udělat ještě drobné úpravy. Soukromý klíč máme v certifikační žádosti a můžeme si jej dát do samostatného souboru a to takto:
openssl rsa -in newreq.pem -out server.key
Následně spojíme tento soukromý klíč s certifikátem:
cat newcert.pem server.key > vsftpd-cert-key.pem
A zbytek už je jednoduchý, stačí certifikát s klíčem nakopírovat například
do adresáře /etc/vsftpd/vsftpd-cert-key.pem
a nastavit příslušná
práva.
chmod 600 /etc/vsftpd/vsftpd-cert-key.pem
Nezapomeňte také po sobě uklidit v adresáři, kde jste si generovali dané věci a nastavit práva tak, aby dané soubory nemohl nikdo zneužít.
Samotná konfigurace VSFTPD je stejná jako při self signed certifikátu, tedy:
ssl_enable=YES ssl_tlsv1=YES rsa_cert_file=/etc/vsftpd/vsftpd-cert-key.pem force_local_logins_ssl=YES force_local_data_ssl=YES
Volby force_local_logins_ssl=YES
,
force_local_data_ssl=YES
a ssl_tlsv1=YES
jsem uvedl
jen pro informaci, jsou nastaveny defautně na YES
a proto není
potřeba je v konfiguračním souboru uvádět.