Obsah

Apache

OTP ověření

https://www.clearhat.org/post/configure-one-time-password-k-2fa-or-mfa-apache-using-mod-authn-otp-and-freeotp

Upravený skript, generuje QR kód, který je použitelný jak pro Apache reverse proxy tak pro Mikrotik VPN

Skript createOTPuser je ve složce sbin na reverzním proxy. Při generování více uživatelů lze použít vstupní csv soubor users.csv.
Skript vygeneruje QR png soubor, hotp_users.txt soubor s údaji pro OTP konfiguraci Apache serveru(/etc/apache2/OTP/users.otp) a soubor mikrotik_users.txt s údaji pro konfigurace User manageru v Mikrotiku.

createOTP
#!/bin/bash
 
# Kontrola vstupn_ch parametr_
if [ "$#" -ne 2 ]; then
  echo "Pou_it_: $0 <username> <app_nam"
  exit 1
fi
 
# Vstupn_ parametry
USERNAME="$1"
APP_NAME="$2"
 
 
# Generov_n_ n_hodn_ho kl_~Me v bin_rn_m form_tu
#HEX_KEY=$(head -c "$KEY_LENGTH" /dev/urandom | xxd -p | tr -d '\n')
HEX_KEY=$( head -c 1024 /dev/urandom | openssl sha1 | awk '{ print $2 }' | head -c 30 )
BASE32_KEY=$(echo -n "$HEX_KEY" | base32 | tr -d '=')
 
# Generov_n_ OTP URL
OTP_URL=$(genotpurl -k "$HEX_KEY" -L "$USERNAME" -I "$APP_NAME")
 
# Generov_n_ QR k_du
OUTPUT_FILE="${USERNAME}.png"
qrencode -s 10 -t PNG -o - "$OTP_URL"  -o "$OUTPUT_FILE"
 
# Ukl_d_n_ dat do CSV souboru
CSV_FILE="usersOTP.csv"
echo "$USERNAME,$HEX_KEY,$BASE32_KEY,$APP_NAME" >> "$CSV_FILE"
 
# Informace o _sp~[_n_m proveden_
echo "QR k_d byl ulo_en do: $OUTPUT_FILE"
echo "Informace byly p~Yid_ny do: $CSV_FILE"
apt install git apache2 apache2-dev build-essential qrencode libssl-dev

git clone https://github.com/archiecobbs/mod-authn-otp.git
cd mod-authn-otp

./autogen.sh
./configure && make
make install

echo "LoadModule authn_otp_module /usr/lib/apache2/modules/mod_authn_otp.so" | tee -a /etc/apache2/mods-available/authn_otp.load

# Pro kazdeheho uzivatele - zmente username na aktualniho uzivatele
KEY=$( head -c 1024 /dev/urandom | openssl sha1 | awk '{ print $2 }' | head -c 10 )
echo "HOTP/T30/6 username - ${KEY}" | tee -a /etc/apache2/OTP/users.otp
URL=$(genotpurl -I "GriffTeamProxy" -L "username" -k ${KEY})
qrencode -s 10 -t PNG -o - ${URL} -o username_proxy.png



chown root:www-data /etc/apache2/OTP/users.otp
chmod 644 /etc/apache2/OTP/users.otp

#Virtual host config /etc/apache2/sites-available/000-default.conf - příklad pro Home Assistant

<VirtualHost *:80>
<Location "/">
    AuthType basic
    AuthName "OTP Protected Area"
    AuthBasicProvider OTP
    OTPAuthUsersFile "/etc/apache2/OTP/users.otp"
    Require valid-user
    # other options...
</Location>
   ServerName has.sweethome.local
   ProxyPreserveHost On
   #ProxyRequests off
   ProxyPass /api/websocket ws://10.199.0.200:8123/api/websocket
   ProxyPassReverse /api/websocket ws://10.199.0.200:8123/api/websocket
   ProxyPass / http://10.199.0.200:8123/
   ProxyPassReverse / http://10.199.0.200:8123/

   Header always set X-Frame-Options SAMEORIGIN
   Header always set X-XSS-Protection "1; mode=block"
   Header always set X-Content-Type-Options nosniff

   ErrorLog ${APACHE_LOG_DIR}/homeassistant_error.log
   CustomLog ${APACHE_LOG_DIR}/homeassistant_access.log combined
</VirtualHost>

service apache2 restart

Pozor Apache standardně předává autorizační hlavičky, to. zn. pokud backend server podporuje Basic Authentication, tak mu přijde jméno a OTP heslo. Nedojde k ověření a systém se „zacyklí - nezacyklí, ale vypadá to tak“.

Proto je potřeba přidat do konfigurace host v Apache parametr RequestHeader unset Authorization

Příklad konfigurace pro Jira

<VirtualHost *:443>
<Location "/">
    AuthType basic
    AuthName "OTP Protected Area"
    AuthBasicProvider OTP
    OTPAuthUsersFile "/etc/apache2/OTP/users.otp"
    Require valid-user
    # other options...
</Location>
                AllowEncodedSlashes On
                # JIRA
                ServerName jira.tool4dev.com
                #ServerAlias jira.hpl.cz jira.griffteam.com jira.griffteam.cz
                RewriteEngine On
                RewriteCond %{HTTP_HOST} ^jira\.hpl\.cz$ [NC]
                RewriteRule ^ https://jira.tool4dev.com%{REQUEST_URI} [R=302,L]
                SSLEngine on
                SSLProxyEngine on
                ProxyPreserveHost on
                ProxyPass / https://192.168.10.58/ keepalive=On
                ProxyPassReverse / https://192.168.10.58/
                # Odstrani halvicku Authoriztion pred odeslanim na backend server
                RequestHeader unset Authorization
                SSLProxyCheckPeerCN off
                SSLCertificateFile  /etc/ssl/certs/jira.hpl.cz.cer
                SSLCACertificateFile /etc/ssl/certs/ca.cer
                SSLCertificateKeyFile /etc/ssl/private/jira.hpl.cz.key

                RequestHeader set X-Forwarded-Proto "https"
                RequestHeader set X-Forwarded-Ssl on
                #SSLProtocol +SSLv3 +TLSv1 +TLSv1.1 +TLSv1.2
                SSLProtocol +TLSv1 +TLSv1.1 +TLSv1.2
                LogLevel warn
                ErrorLog ${APACHE_LOG_DIR}/jira_error.log
                CustomLog ${APACHE_LOG_DIR}/jira_access.log combined
</VirtualHost>

Chyba mail, webmail

Na mailovém serveru přestal fungovat webmail.
Při pokusu o restart serveru se objevila se následující hláška:

Restarting web server: apache2(98)Address already in use: make_sock: could not bind to address [::]:443

Pomohlo zahashování řádků v souboru ports.cfg. V souboru nesmí být vícenásobně použit příkaz Listen pro stejný port. Kde se tam vzaly duplicitní záznamy je otázka? Je možné, že v rámci update balíků Apache.

NameVirtualHost *:80 Listen 80

### <IfModule mod_ssl.c>
###     # If you add NameVirtualHost *:443 here, you will also have to change
###     # the VirtualHost statement in /etc/apache2/sites-available/default-ssl
###     # to <VirtualHost *:443>
###     # Server Name Indication for SSL named virtual hosts is currently not
###     # supported by MSIE on Windows XP.
###     Listen 443
### </IfModule>
###
<IfModule mod_gnutls.c>
    Listen 443
</IfModule>
DokuWiki Appliance - Powered by TurnKey Linux