26 (edytowany przez smereka 2016-06-29 14:28:23)

Odp: Openvpn - dwu stopniowa walidacja

Hmm nie działa... sad Znaczy jak dodałem to co mi dałeś to mam w logach:

ed Jun 29 13:18:08 2016 daemon.warn openvpn(sample_server)[3043]: 192.168.0.176:4837 WARNING: Failed running command (--auth-user-pass-verify): external program exited with error status: 1
Wed Jun 29 13:18:08 2016 daemon.err openvpn(sample_server)[3043]: 192.168.0.176:4837 TLS Auth Error: Auth Username/Password verification failed for peer
Wed Jun 29 13:18:08 2016 daemon.notice openvpn(sample_server)[3043]: 192.168.0.176:4837 SIGTERM[soft,auth-control-exit] received, client-instance exiting
root@OpenWrt:~#

Wcześniej w logach jest weryfikacja certyfikatów jeszcze ale są tam dane wrażliwe więc pominąłem to. Generalnie na tym co wkleiłem się zatrzymuje cały ten proceder. Oczywiście testuję to lokalnie (stąd adres IP prywatny) czyli komputer łączy się zza routera z vpn poprzez port wan. Nie za bardzo jednak rozumiem jak taka weryfikacja ma działać. Bo i ile po haśle i loginie, które są w katalogu openvpn_auth to rozumiem, że z tym porównuje ale nie rozumiem w którym miejscu i jaki skrpyt odpowiada za weryfikację CN z loginem czy też hasłem. No bo skąd router mam wiedzieć, że klient z CN adam ma zostać porównany z hasłem dla adam. Przecież jak w userlist wrzucę wszystkich klientów to wiadomo że w końcu podczas skanowania wyłuska w końcu np adam czy krzyśka czy innych. Rozumiesz co mam na myśli? A może ja to źle interpretuję...

27 (edytowany przez advcron 2016-06-30 08:23:20)

Odp: Openvpn - dwu stopniowa walidacja

To od początku.
Zobacz na wpis który Ci podałem ver-pass.sh

#!/bin/sh
pass=`awk "\\\$1 == \"${username}\" { print substr(\\\$0,length(\\\$1)+2) }" /etc/openvpn/client/openvpn-auth`
#echo $pass >> /etc/openvpn/client/auth_txt
test -n "$pass" && test "$pass" == "${password}" && grep -w "$common_name $username" /etc/openvpn/client/userlist.txt && exit 0
#echo "grep -w $common_name $username /etc/openvpn/client/userlist.txt && exit 0" >> /etc/openvpn/uth_txt
exit 1

Zastanów się co on robi.
Pierwsza linia przypisanie hasła do zmiennej pass .Odchaszuj sobie echo jak wyżej i zobacz to naocznie w pliku.
Druga linia:  Najpierw sprawdza czy zmienna $pass ma niezerową wartość, następnie porównuje ją ze zmienną $password (zmienna password to zmienna przekazywana Ci przez openvpn podczas łączenia się klienta). Tu masz wlaśnie sprawdzenie loginu i hasła Jeśli jest ok to przechodzi do następnego członu. Czyli grepa. W nim masz właśnie wspomnianą walidację  Username = CN ($common_name $username  - przekazywane Ci przez openvpn). Jeśli taki wpis istnieje w pliku to grep zakończy się statusem ok i przejdzie do dalszej części, a więc exit 0, co oznacza prawidłowe zakończenie skryptu. Jeśli nie to exit 1 i błąd. Tak się dzieje w twoim przypadku. Znowu włącz echo, aby to zobaczyć.
Czemu Ci się kończy błędem wykonanie skryptu? Tego nie wiem. Pokaż mi wpis z userlist, i wygenerowany podczas łączenie wspomniany auth.txt ponadto może nie masz zainstalowanego grep lub basha w systemie

Zrób mały test: Utwórz plik wykonywalny.

#!/bin/bash
grep -w "Jan Nowak jnowak" /etc/openvpn/client/userlist.txt 
#grep -q "Jan Nowak jnowak" /etc/openvpn/client/userlist.txt 
echo $?

I zobacz co będzie przy prawidłowym i nieprawidłowym wpisie w userlist.  (-q -w zobacz raz tak, raz tak)


Co do weryfikacji samego certyfikatu. Tego dokonujesz w pliku vpncheckCN-cert. Działa to na podobnej zasadzie. Z przekazanego do skryptu całego DN sed wyłuskuje CN i szuka czy w userlist nie ma takiego wpisu.

grep -w "`echo "$3" | sed -r 's/.*CN=([^,]*),.*/\1/'`" $1 && exit 0

Jak byś się zagłębił troszkę w dokumentację , to byś zobaczył, że do takiego skryptu możemy podać wiecej różnych parametrów np:

X509_{n}_{subject_field}
    An X509 subject field from the remote peer certificate, where n is the verification level. Only set for TLS connections. Set prior to execution of --tls-verify script. This variable is similar to tls_id_{n} except the component X509 subject fields are broken out, and no string remapping occurs on these field values (except for remapping of control characters to "_"). For example, the following variables would be set on the OpenVPN server using the sample client certificate in sample-keys (client.crt). Note that the verification level is 0 for the client certificate and 1 for the CA certificate.
    X509_0_emailAddress
    X509_0_CN
    X509_0_O
    X509_0_ST
    X509_0_C
    X509_1_emailAddress
    X509_1_O
    X509_1_L
    X509_1_ST
    X509_1_C

Czyli możesz sobie dopisać do skryptu dodatkowe parametry do walidacji np wszystkie certy z OU=Kierownicy będą mieli dostęp itp.
Tu masz wszystkie zmienne: https://community.openvpn.net/openvpn/w … nPage#lbAR

28 (edytowany przez smereka 2016-06-30 08:52:29)

Odp: Openvpn - dwu stopniowa walidacja

Dobra działa. W sumie to nie wiem co pomogło jak wkleiłem Twoje ostatnie wpisy oraz zainstalowałem grep i bash (co było najbardziej prawdopodobną przyczyną) to zaczęło pięknie działać. Bardzo Ci dziękuję za pomoc. Jak będziesz advcron w Warszawie lub Białymstoku (a może jesteś?) daj znać to czteropaka piweczka ode mnie dostaniesz smile

29 (edytowany przez smereka 2017-03-08 13:52:58)

Odp: Openvpn - dwu stopniowa walidacja

Przeszedłem w ramach testów na LEDE przemaglowane przez Obsego na routerze WRT1900AC v2. To co było dokonane w poście wyżej działa na Asusie AC56U i bardzo dobrze działa. Już niedługo będzie rok. Asusa na razie zostawiłem jak działa to niech działa. Ale chciałbym mieć backup sprzętowy w razie jakby kipnął to podmiana i ogień! Za żadne skarby przeniesiona ząb w ząb konfiguracja nie chce się odpalić (kopia wszystkie network, firewall i inne badziewia). Proszę o pomoc o co temu dziadowi znowu chodzi. Przy próbie odpalenia servera vpn z luci wywala w logach to:

Wed Mar  8 13:44:59 2017 daemon.err openvpn(sample_server)[3833]: Options error: the --tls-verify directive should have at most 1 parameter.  To pass a list of arguments as one of the parameters, try enclosing them in double quotes ("").
Wed Mar  8 13:44:59 2017 daemon.warn openvpn(sample_server)[3833]: Use --help for more information.
Wed Mar  8 13:44:59 2017 daemon.err openvpn(sample_server_2)[3834]: Options error: the --tls-verify directive should have at most 1 parameter.  To pass a list of arguments as one of the parameters, try enclosing them in double quotes ("").
Wed Mar  8 13:44:59 2017 daemon.warn openvpn(sample_server_2)[3834]: Use --help for more information.

Mam oczywiście postawione 2 serwery na różnych portach

Tu config:

config openvpn 'sample_server'
    option enabled '1'
    option port '443'
    option proto 'udp'
    option dev 'tun1'
    option ca '/etc/openvpn/ca.crt'
    option cert '/etc/openvpn/server.crt'
    option key '/etc/openvpn/server.key'
    option dh '/etc/openvpn/dh1024.pem'
    option server '10.8.2.0 255.255.255.0'
    list route '192.168.7.0 255.255.255.0'
    list route '192.168.8.0 255.255.255.0'
    list route '192.168.9.0 255.255.255.0'
    list route '192.168.10.0 255.255.255.0'
    list route '192.168.11.0 255.255.255.0'
    list route '192.168.12.0 255.255.255.0'
    list route '192.168.13.0 255.255.255.0'
    list route '192.168.14.0 255.255.255.0'
    list route '192.168.15.0 255.255.255.0'
    list route '192.168.16.0 255.255.255.0'
    list route '192.168.17.0 255.255.255.0'
    list route '192.168.18.0 255.255.255.0'
    list route '192.168.19.0 255.255.255.0'
    list route '192.168.20.0 255.255.255.0'
    list route '192.168.21.0 255.255.255.0'
    list route '192.168.22.0 255.255.255.0'
    list route '192.168.23.0 255.255.255.0'
    list route '192.168.24.0 255.255.255.0'
    list route '192.168.25.0 255.255.255.0'
    list route '192.168.26.0 255.255.255.0'
    list route '192.168.27.0 255.255.255.0'
    list route '192.168.28.0 255.255.255.0'
    list route '192.168.29.0 255.255.255.0'
    list route '192.168.30.0 255.255.255.0'
    list route '192.168.31.0 255.255.255.0'
    list route '192.168.32.0 255.255.255.0'
    list route '192.168.33.0 255.255.255.0'
    list route '192.168.34.0 255.255.255.0'
    option ifconfig_pool_persist '/tmp/ipp.txt'
    option keepalive '10 120'
    option comp_lzo 'yes'
    option persist_key '1'
    option persist_tun '1'
    option user 'nobody'
    option status '/tmp/openvpn-status.html'
    option verb '3'
    option client_config_dir '/etc/openvpn/ccd'
    option client_to_client '1'
    option script_security '3'
    option auth_user_pass_verify '/etc/openvpn/ver_pass.sh via-env'
    option tls_verify "/etc/openvpn/vpncheckCN_cert.sh /etc/openvpn/client/userlist.txt"

30

Odp: Openvpn - dwu stopniowa walidacja

Obejście, bo nie wiem co jest powodem - przerób sobie lekko /etc/openvpn/vpncheckCN_cert.sh żeby sam odwoływał sie do /etc/openvpn/client/userlist.txt zamiast brać to jako argument.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

31

Odp: Openvpn - dwu stopniowa walidacja

Ewentualnie przenieść konfigurację do standardowego konfigu ovpn (ja wole w ten sposób)

config openvpn 'Serwer'
    option config '/etc/openvpn/openvpn_2step.conf'
    option enabled '1'

config openvpn 'Site2Site'
    option config '/etc/openvpn/site2site.conf'
    option enable '1'

32

Odp: Openvpn - dwu stopniowa walidacja

Obsy,

Pomógłbyś jak przerobić to co pisałeś 1 post wyżej bo ja nie za bardzo trawie te wszystkie skrypty i regułki. Dziękuję

33

Odp: Openvpn - dwu stopniowa walidacja

Pokaż zawartość /etc/openvpn/vpncheckCN_cert.sh

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

34

Odp: Openvpn - dwu stopniowa walidacja

#!/bin/sh
#    vpncheckCN-cert -- an OpenVPN tls-verify script
#    """""""""""""""""""""""""""""""""""""""""""
#
#    This script checks if the peer is in the allowed
#    user list by checking the CN (common name) of the
#    X509 certificate against a provided text file.
#
#    For example in OpenVPN, you could use the directive
#    (as one line):
#
#    tls-verify "/etc/openvpn/vpncheckCN-cert.sh
#                /etc/openvpn/userlist.txt"
#
#    This would cause the connection to be dropped unless
#    the client common name is within the userlist.txt.
#
#    Special care has been taken to ensure that this script
#    also works on openwrt systems where only busybox is
#    available
#
#    Written by Robert Penz <robert[at]penz.name> under the GPL 2
#    Parts are copied from the verify-cn sample OpenVPN
#    tls-verify script.
#
#    Modifications made by Rafal Cichosz (rpc[at]rpc.one.pl)



[ $# -eq 3 ] || { echo usage: ovpnCNcheck.sh userfile certificate_depth X509_NAME_oneline ; exit 255 ; }

# $2 -> certificate_depth
if [ $2 -eq 0 ] ; then
    # $3 -> X509_NAME_oneline
    # $1 -> cn we are looking for
#       echo "grep -q `echo $3 | awk -F"/" '{for (i=1; i<=NF; i++) if ($i ~ /CN=.*/) tmp=substr($i,4)} END {print tmp}'` $1 && exit 0" >> /etc/openvpn/client/1
#       echo "grep -q "^$common_name $username" $PWD/userlist.txt && exit 0" >> /etc/openvpn/client/1

    #script debian
        # grep -q "`expr match "$3" ".*/CN=\([^/][^/]*\)"`$" "$1" && exit 0
    #or other script by openwrt
#    grep -q `echo $3 | awk -F"/" '{for (i=1; i<=NF; i++) if ($i ~ /CN=.*/) tmp=substr($i,4)} END {print tmp}'` $1 && exit 0

#    echo "grep -q `echo $3 | awk -F"/" '{for (i=1; i<=NF; i++) if ($i ~ /CN=.*/) tmp=substr($i,4)} END {print tmp}'` $1 && exit 0" >> /etc/openvpn/client/2
#    echo "grep -q `echo $3` && exit 1" >> /etc/openvpn/client/2
#    echo "grep -q "`expr match "$3" ".*/CN=\([^/][^/]*\)"`$" "$1" && exit 2" >> /etc/openvpn/client/2
#    echo "grep -q `echo Jan_Nowak` $1 && exit 3"  >> /etc/openvpn/client/2
#    grep -q `echo $3 | awk -F"/" '{for (i=1; i<=NF; i++) if ($i ~ /CN=.*/) tmp=substr($i,4)} END {print tmp}'` $1 && exit 0
#    grep -q `echo Jan_Nowak` $1 && exit 0
#    grep -q "`expr match "$3" ".*/CN=\([^/][^/]*\)"`$" "$1" && exit 0

# Uniwersalne Debian+Openwrt
#    echo "grep -w "`echo "$3" | sed -r 's/.*CN=([^,]*),.*/\1/'`" $1 && exit 0" >> /etc/openvpn/client/2
    grep -w "`echo "$3" | sed -r 's/.*CN=([^,]*),.*/\1/'`" $1 && exit 0
    exit 1
fi

exit 0

35

Odp: Openvpn - dwu stopniowa walidacja

Ale tam Ci argumentu brakuje:

[ $# -eq 3 ] || { echo usage: ovpnCNcheck.sh userfile certificate_depth X509_NAME_oneline ; exit 255 ; }

Ma być trzy nie dwa

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

36

Odp: Openvpn - dwu stopniowa walidacja

Czyli jak powiano wyglądać? Gdzie mam wstawić 3 zamiast 2?

37

Odp: Openvpn - dwu stopniowa walidacja

option tls_verify "/etc/openvpn/vpncheckCN_cert.sh /etc/openvpn/client/userlist.txt"

ma być

option tls_verify "/etc/openvpn/vpncheckCN_cert.sh /etc/openvpn/client/userlist.txt XXXXX"

Za XXXXX sobie podstaw nazwę CN taką jak masz w certyfikacje, bo Rafał tak sprawdza.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.