27.11.2017

foto Petr Bravenec

Petr Bravenec
Twitter: @BravenecPetr
+420 777 566 384
petr.bravenec@hobrasoft.cz

Člověk si tak několik let ke své plné spokojenosti provozuje databázi CouchDB, než mu jednoho dne monitorovací systém nahlásí stoprocentní využití procesoru na databázovém serveru. Někdo si na našem serveru spustil program xmrig pro těžbu kryptoměn. Moje reakce byla rychlá. Zastavil jsem CouchDB, smazal útočníkovu databázi, zakázal přístup bez šifrování, zavedl certifikáty od Let's Encrypt, změnil hesla a zakázal vytváření nových uživatelů.

Opatření

Zavedení uživatelů

Pokud chcete mít CouchDB přístupnou přes Internet, první věcí by mělo být zavedení administrátorského účtu a dalších účtů pro přístup k databázím. CouchDB totiž normálně umožní přístup komukoliv – poslouchá ovšem pouze na 127.0.0.1, přístup je možný pouze z localhost. Jakmile byste povolili přístup adminům z celého světa (CouchDB používá pojem "Admin Party"), mohl by si s vaším databázovým serverem dělat kdokoliv cokoliv.

Uživatelé na našem serveru pochopitelně zavedení byli, před provozováním serveru bez uživatelů dostane správce serveru dostatek varování v dokumentaci:

CouchDB, The Definitive Guide – Security
Apache CouchDB 2.0 Documantation » 1. Introduction » 1.6. Security

Povolení přístupu přes SSL

Přístup přes SSL byl na našem databázovém serveru povolený vždy a programy používají výhradně přístup přes SSL. Přesto jsem překontroloval SSL ještě jednou a nastavil certifikáty od Let's Encrypt. Získání certifikátů zde nebudu popisovat – na serveru jsou certifikáty k dispozici i kvůli jiným službám. O to jsem měl nastavení certifikátů jednodušší.

V souboru /etc/couchdb/local.ini:

[httpd]
; Server poslouchá na veřejné IPv6 adrese (včetně IPv4)
bind_address = ::

[daemons]
; start HTTPS služby
httpsd = {couch_httpd, start_link, [https]}

[ssl]
; cesta k certifikátům
cert_file = /home/certificates/.acme.sh/couchdb.hobrasoft.cz/fullchain.cer
key_file  = /home/certificates/.acme.sh/couchdb.hobrasoft.cz/couchdb.hobrasoft.cz.key

Zákaz přístupu bez SSL šifrování

Tohle už vyžadovalo něco málo googlování a experimentů. V konfiguračním soubor /etc/couchdb/default.ini je potřeba zakázat startování http serveru bez šifrování:

[daemons]
; Nutné zakomentovat tento řádek – použijte středník!
; httpd={couch_httpd, start_link, []}

[CouchDB-user] Disable default unsecure plain HTTP 5984

Zákaz vytváření nových uživatelů

CouchDB mě mírně šokovala – na databázovém serveru si skutečně může ve výchozím nastavení kdokoliv vytvořit uživatele a případně i vlastní databázi. Abych zakázal vytváření anonymních uživatelů, musel jsem opět trochu googlovat. Úprava není příliš složitá, ale je překvapivé, že vytváření uživatelů nelze zakázat jednodušeji.

V databázi _users v dokumentu _design/_auth je potřeba přepsat kód v položce validate_doc_update. Kontrola se provádí uvnitř funkce is_server_or_database_admin(). Kontrola vypadá v kódu přibližně takto:

//[…existující kód…]
if (!is_server_or_database_admin(userCtx, secObj)) {
    if (oldDoc) { // validate non-admin updates
//[…existující kód…]

Do funkce je potřeba přidat jeden řádek, funkce po změně vypadá takto:

//[…existující kód…]
if (!is_server_or_database_admin(userCtx, secObj)) {
    throw({forbidden: 'Users can only be created by server od db admins in this specific CouchDB installation'});
    if (oldDoc) { // validate non-admin updates
//[…existující kód…]

CouchDB: user creation without authentication. standard behavior?

Závěr

Databáze CouchDB klade ve svém výchozím nastavení důraz na snadné použití, což může kolidovat s bezpečností. Databázi je samozřejmě možné i na internetu používat bezpečně, je však nutné ji náležitě nastavit.

Hobrasoft s.r.o. | Kontakt