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.
#!/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>
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>