====== Semestrální úloha ======
Student dostane k dispozici linuxový server se základní instalací operačního systému Debian. Úkolem je nainstalovat webovou aplikaci s autentizací uživatelů a správně zabezpečit server. Mezi 12. a 13. týdnem semestru si studenti vzájemně provedou bezpečnostní testování serveru. Na základě výsledků tohoto testování mají možnost ještě upravit konfiguraci serveru a ten poté odevzdají k hodnocení.
===== 1. Požadavky =====
Semestrální úloha se skládá ze dvou částí
- konfigurace serveru, instalace a konfigurace aplikace;
- bezpečnostní otestování serveru jiného studenta dle zadaných kontrolních otázek.
**Požadavky na aplikace**
* Dokončit konfiguraci operačního systému.
* Nainstalovat jednu webovou aplikaci včetně potřebných komponent:
* aplikaci si student vybírá ze seznamu či ji může navrhnout sám (vyučující výběr schvaluje),
* aplikace musí mít autentizaci uživatelů,
* hesla uživatelů musí být uložena v LDAPu (centrální autentizace uživatelů),
* uživatel aplikace musí mít možnost změnit si své heslo - obvykle přes samostatnou aplikaci,
* Správa uživatelů v LDAPu musí být možná přes webové rozhraní.
* Založit účet pro auditora. Auditor musí mít přístup přes ssh včetně sudo. Dále potřebuje přístup k aplikaci, aby mohl ověřit její funkčnost.
**Bezpečnostní požadavky**
* nainstalovány aktualizace,
* minimalizovat počet otevřených síťových portů na nezbytné funkční minimum,
* logování přístupu,
* parametry https:
* certifikát pro https, který bude uznáván ve většině prohlížečů,
* veškeré spojení přes SSL (redirect z http),
* nastavení [[https://www.owasp.org/index.php/HTTP_Strict_Transport_Security|HTTP Strict Transport Security]],
* podpora [[https://en.wikipedia.org/wiki/Transport_Layer_Security#TLS_1.3| TLS 1.3]],
* podpora [[https://en.wikipedia.org/wiki/HTTP/2|http/2]
* při dotazech s chybným či chybějícím servername (viz SNI) či hostname (viz HTTP) vracet chybu či neutrální stránku,
* server musí získat v testech [[https://www.ssllabs.com/ssltest/|SSLLabs]] hodnocení **A** či **A+**,
* SSH - přihlášení pouze pomocí klíčů,
* přístup k webové aplikaci pro správu LDAPu musí být omezen na školní síť (IP rozsah 146.102.0.0/16). Obdobné omezení platí i pro aplikace pro správu databáze (adminer, phpmyadmin). Při práci z domova lze využít [[http://vpnka.vse.cz|školní VPNku]].
Před servery je nainstalován **firewall**, který povoluje provoz z celého světa na portech 22, 80 a 443. Ze školní sítě je povolen veškerý provoz s výjimkou SMTP (tcp/25) a Microsoft Network.
Ze serverů je omezeno odesílání pošty - adresa odesílatele musí být ze školní domény (@vse.cz, @bis122.vse.cz, ...). Na serverech není možné přijímat poštu z vnějšku.
**Požadovaná dokumentace**
* {{ ::predbezny_protokol.docx | Předběžný protokol o instalaci}},
* :!:{{ ::audit_-_kontrolni_otazky.docx | Protokol o testování (auditu) serveru - kontrolní otázky}} - aktualizace ze 28. března 2024,
* {{ ::zaverecny_protokol.docx | Závěrečný protokol o instalaci serveru}},
Změny od ZS 2024/2025:
* odebrán požadavek na OCSP stapling, ([[https://letsencrypt.org/2024/07/23/replacing-ocsp-with-crls.html|OCSP deprecation]]),
* doplněn požadavek na TLS 1.3,
* doplněn požadavek na HTTP/2
===== 2. Termíny =====
^ úkol ^ způsob splnění ^ termín ^
| Volba aplikace | V InSIS zvolena aplikace (téma) | do 10. cvičení |
| Nainstalování serveru včetně aplikací | Nainstalován Apache (web server), LDAP server, aplikace - nemusí být vše propojené dohromady. Vytvořen účet pro auditora. Předběžný protokol o instalaci uložený do odevzdávárny v InSIS. | do 12. cvičení |
| Bezpečnostní otestování cizího serveru | Protokol o bezpečnostním testování odevzdán do odevzdávárny v InSIS. | mezi 12. a 13. cvičením |
| Závěrečné úpravy vlastního serveru | Protokol o instalaci serveru odevzdán do odevzdávárny v InSIS | do konce zkouškového (cvičící může termín změnit) |
===== 3. Bodování =====
Za semestrální úlohu může student získat 30 bodů, z toho 8 bodů je za audit cizího serveru, 22 bodů je za instalaci serveru. Student může získat prémiové body za originální nebo zajímavé řešení.
U **auditu serveru** se odečítají body např. za:
* pozdní odevzdání,
* neprovedení části auditu (na testovaném serveru nejsou stopy po testování),
* informace protokolu neodpovídají reálnému stavu serveru,
Z **bodů za instalaci serveru** se odečítá např. za následující nedostatky:
* lze se přihlásit přes SSH pomocí hesla,
* neplatný certifikát u https,
* chybí redirect z http na https pro všechny či část aplikací,
* chybí HSTS,
* není podpora TLS 1.3, není podpora HTTP/2,
* server nemá hodnocení **A** či **A+** na SSLLabs,
* není nainstalován LDAP server,
* LDAP server neobsahuje uživatele,
* uživatelé ve webové aplikaci se neautentizují vůči LDAPu,
* není nainstalována či funkční aplikace,
* program lynis vrací méně než 65%,
* chybějící závěrečný protokol,
* student nainstaloval zbytečnou komponentu (např. na serveru běží MySQL databáze, ale aplikace ji nepoužívá).
Student může přijít o body i **za nesplnění termínů**. Za předmět jsou definovány dva termíny, cvičící může přidat i další.
- 5. cvičení, SSH - **zakázáno přihlašování pomocí hesla**. Budu kontrolovat, že se na studentský server nedá přihlásit pomocí hesla (výjimkou může být přihlášení z bis.vse.cz). Za každý započatý týden nesplnění odečítám dva body.
- **Příprava serveru pro audit**. Před začátkem auditů serverů (obvykle po cvičení ve 12. týdnu) vyučující kontroluje stav serverů a může správci serveru odečíst body při nesplnění některého z požadavků. V případě problémů s účtem auditora může odečítat body vlastníkovi serveru i auditorovi - kdo zavinil problémy. Kontroluje se:
* Zda je založen účet pro auditora, zda se již přihlásil, zda může udělat sudo. Při zakládání účtů používejte školní přihlašovací jména.
* Zda je nainstalován a běží webový server a odpovídá na portu 80 (http) a 443 (https). Na portu 80 postačuje přesměrování na port 443.
* Zda je nainstalován a běží LDAP server (proces slapd).
* Zda existuje aspoň pokus o instalaci vlastní aplikace.
===== 4. Doporučení =====
==== Certifikáty ====
Získání certifikátu pro server:
* [[https://letsencrypt.org/|Let's Encrypt]] - automatizované získávání certifikátu. Jedna doména může získat za týden [[https://letsencrypt.org/docs/rate-limits/ | jen 20 certifikátů]]. Od ledna 2018 má doména vse.cz zvýšený limit 250 certifikátů za týden.
* Potřebujete nainstalovat aplikaci, která bude pravidelně certitifikát Let's Encrypt obnovovat. Nejznámější je **certbot**, který je součástí Debianu. Popis je na webu [[https://certbot.eff.org/]]. Stručný popis instalace je např. v článu [[ https://shape.host/resources/certbot-installation-guide-on-debian-12 | Certbot Installation Guide on Debian 12 ]].
* Apache má v sobě podporu pro automatické získání certifikátů, popis je např. v článku [[ https://www.root.cz/clanky/https-certifikat-let-s-encrypt-pomoci-apache-a-vestaveneho-modulu-mod-md/ | HTTPS certifikát Let's Encrypt pomocí Apache a vestavěného modulu mod_md ]]
* Dalšími používanými aplikacemi pro správu certifikátů jsou **[[ https://github.com/Neilpang/acme.sh | acme.sh ]]** či **[[https://github.com/lukas2511/dehydrated | dehydrated]]**. V obou případech jsou k dispozici balíčky pro Debian.
==== Databáze MySQL a MariaDB ====
Databáze MySQL je historicky velmi oblíbená u webových aplikací. MySQL databáze není open source, licence neumožňuje její přímou distribuci v Debianu. Existuje klon [[ https://en.wikipedia.org/wiki/MariaDB | MariaDB ]], který je součástí Debianu a doporučuji ho používat. Jedinou výjimkou je situace, kdy se na stránkách aplikace explicitně uvádí, že MariaDB není podporována.
* Návod na instalaci je např. na [[ https://www.sqliz.com/posts/install-mariadb-on-debian-12/ ]]. V kroku ''mysql_secure_installation'' nezadávám heslo pro uživatele ''root'' v DB, nechávám pro něj připojení přes unix socket. K DB je poté přístup bez hesla pomocí ''sudo mysql''.
* Součástí návodu je i vytvoření databáze pro aplikaci a speciálního uživatele v DB pro přístup z aplikace (databáze i uživatel má obvykle stejný název jako aplikace).
* Nainstalujte si aplikaci pro správu databáze, doporučuji [[ https://www.adminer.org/ | adminer ]]. Uživatele ''root'' v DB bez hesla nemohou používat webové aplikace, v admineru se můžete hlásit jako uživatel pro aplikaci (viz předchozí krok) či si vytvořte speciálního uživatele v DB pro správu.
* Je bezpečnostní chyba, pokud Vaše aplikace přistupuje k databázi pod uživatelem root či jiným uživatelem, který může zakládat uživatele v DB či měnit hesla jiným uživatelům. Aplikace by měla používat minimální práva vůči DB.
==== Webové rozhraní pro LDAP ====
Pro správu obsahu na LDAP serveru jsou v Debianu k dispozici dvě aplikace:
* **[[https://www.ldap-account-manager.org/lamcms/|ldap-account-manager]]** - webfrontend for managing accounts in an LDAP directory
* **phpldapadmin** - web based interface for administering LDAP servers - pro poslední verzi Debianu (a pro PHP 7.2 a novější) není k dispozici
=== Instalace a konfigurace ldap-account-manager ===
Ldap account manager (LAM) používá profily. Každý profil definuje, který LDAP server se spravuje a co mohou oprávnění uživatelé tohoto profilu upravovat. Správa profilů je chráněná globálním heslem, konfigurace každého profilu je též chráněna heslem. Další heslo je pro přihlášení do profilu (obvykle uživatel cn=admin,dc=vse,dc=cz) a editaci údajů v rámci profilu. A každý vytvořený uživatel by měl mít své vlastní heslo.
Postup:
- musíte mít nainstalován **apache (https) a PHP** - ověřte si, že Vám dohromady fungují,
- nainstalujte **LDAP server**, tj. balíčky ''slapd'' a ''ldap-utils'', příkaz: ''apt install slapd ldap-utils''
- **ověřte**, že se Vám správně nainstaloval, dotaz ''ldapsearch -x -b dc=vse,dc=cz'' by měl vypsat dva objekty (popř. dotaz včetně URL k LDAP serveru: ''ldapsearch -H ldap://127.0.0.1 -x -b dc=vse,dc=cz''),
- nainstalujte **ldap-account-manager**, příkaz ''apt install ldap-account-manager'',
- na adrese https://bisxxx.vse.cz/lam se Vám otevře webové rozhraní. Nejdříve je potřeba nakonfigurovat vlastní LAM, lze to udělat přes webové rozhraní či přímo v konfiguračních souborech.
- vpravo nahoře je **LAM configuration**
- zvolte **Edit general settings**, počáteční heslo je ''lam'',
- na další stránce **změňte heslo pro globálního správce**,
- přes **LAM configuration** zvolte volbu **Edit server profiles**, počáteční heslo je opět ''lam'',
* úplně dole nastavte **nové heslo pro správu profilu**,
* v **Security settings** nastavte uživatele ''cn=admin,dc=vse,dc=cz''
* časovou zónu nastavte na Prahu, jazyk rozhraní dle svého uvážení,
* v **Tool settings** nastavte **Tree suffix** na ''dc=vse,dc=cz'',
* uložte (Save)
- znovu se vraťte do konfigurace profilu a přejděte na **Account types**
* je nastavena podpora typů Users a Group - je potřeba nastavit v jaké organizační jednotce se mají uživatelé či skupiny zakládat. Obvyklé je ''ou=People,dc=vse,dc=cz'' pro užívatele, a ''ou=group,dc=vse,dc=cz'' pro skupiny.
* u Users místo ''ou=People,dc=my-domain,dc=com'' zadejte ''ou=People,dc=vse,dc=cz''
* u Group místo ''ou=group,dc=my-domain,dc=com'' zadejte ''ou=group,dc=vse,dc=cz''
* uložte
- volitelné - v **Modules** můžete u jednotlivých typů upravit schémata. U users stačí inetOrgPerson (poté je vhodné v Account Types upravit atributy, které se mají zobrazovat v seznamu),
- volitelné - v **Module Settings** můžete nastavit atributy, které se mají vyplňovat při zakládání
- po konfiguraci LAM se vraťte na úvodní obrazovku na přihlaste se (heslo uživatele cn=admin,dc=vse,dc=cz)
- Vypíše se
The following suffixes are missing in LDAP. LAM can create them for you.
You can setup the LDAP suffixes for all account types in your LAM server profile on tab "Account types".
ou=People,dc=vse,dc=cz
ou=group,dc=vse,dc=cz
- nechte založit organizační jednotky (Create). Pokud se uvedené nevypíše, tak jste již ou založili či máte chybu v konfiguraci profilu.
- založte **skupinu**,
- založte **uživatele** - **nezapomeňte nastavit heslo**,
- vyzkoušejte **Tree browser** - je zde jiný pohled na atributy u objektu, lze též ověřit heslo uživatele vytvořeného v LDAPu,
==== Jak řešit problémy s nastavením LDAP? ====
=== Nejčastější chyby ===
* **Chybné URL** - Ldap server je na adrese ldap://127.0.0.1 či ldap://localhost či ldap://127.0.0.1:389 - všechna tři URL vyjadřují to samé. Někdy stačí zadat jen IP adresu: 127.0.0.1. Chybně je https://bisxxx.vse.cz/lam - to je URL k webové aplikaci pro správu LDAP databáze.
* **Neběží LDAP server** - V terminálovém okně (ssh) na serveru zkuste příkaz ''ldapsearch -H ldap://127.0.0.1 -x'' - měl by se vypsat seznam objektů v LDAP databázi. Pokud se nevypíše, tak Vám nejspíše neběží proces slapd. Vypište si spuštěné procesy.
* **Chybí atributy u účtů** - v aplikaci nakonfigurujete atribut mail jako e-mailovou adresu. Když si vypíšete uživatele, tak u nich není vyplněna e-mailová adresa. Vypište si atributy např. přes ldapsearch.
* **Chybná jména atributů** - v aplikaci nakonfigurujete atributy, ale s chybnými jmény. Typicky je problém s atributem pro e-mailovou adresu (//mail//) či s atributem pro uživatelské jméno (//uid// či //cn//).
* **Vynechte skupiny** - ve většině aplikací není potřeba nastavovat skupiny v LDAPu. Pokud můžete, tak je vynechte.
* **Není zvoleno automatické zakládání** - některé aplikace na základě prvního přihlášení přes LDAP založí účet v aplikaci. Je to ale většinou potřeba zaškrtnou v konfiguraci propojení. Často je poté uživatel v aplikaci založen s minimálními právy. POZOR - některé aplikace nezakládají účet v aplikaci, některé naopak vyžadují ruční založení v aplikaci.
* TODO
=== Výpis dotazů na LDAP server ===
Pokud předchozí rady nepomohou, tak můžete zkusit vypsat si dotazy na LDAP server dle následujícího postupu:
- ukončete službu slapd pomocí\\ ''sudo systemctl stop slapd''
- spusťte slapd v debugovacím režimu pomocí následujícího příkazu\\ ''sudo /usr/sbin/slapd -h ldap://127.0.0.1:389/ -g openldap -u openldap -F /etc/ldap/slapd.d -d 256''
- zkuste se ve Vaší aplikaci přihlásit (u některých aplikací nezapomeňte zvolit, že se připojujete přes LDAP):
* **žádný požadavek se neobjeví** - máte nejspíše chybně server (IP adresu či URL, chybné číslo portu, chybně nastaveno šifrování spojení (nešifrovat)). Jinou možností je, že aplikace kontroluje, že uživatel je založen i v ní - někdy je potřeba zaškrtnout volbu pro automatické založení účtu, někdy je potřeba založit účet v aplikaci a přiřadit ověření přes LDAP.
* objeví se informace o **chybném hesle** (požadavek BIND)
* ověření hesla proběhlo, ale další požadavek skončil chybou - nejsou vyplněny některé atributy, vyžadujete nastavení skupin, ale skupiny nejsou vytvořeny, ...
- ukončení aplikaci slapd (Ctrl/C),
- spusťte proces slapd\\ ''sudo systemctl start slapd''