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.

Naposledy změněno: 11.2.2007 10:40