Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2015-02-16 16:01:56

  jmp - Użytkownik

jmp
Użytkownik
Zarejestrowany: 2015-02-16

iptables + psad + fail2ban można zrobić to lepiej ? nginx + php-fpm

Witam,

Na wstępie muszę zaznaczyć że jestem początkujący w sztuce administracji jest to moje 1 iptables które sam napisałem(no nie dokońca sam parę rzeczy skopiowałem). I też pierwszy vps którym próbuje administrować.

Jest to vps ovh classic 1 i stoi na OpenVZ.

Przede wszystkim rozchodzi mi się o iptables i w jaki sposób mogę usprawnić działanie/skuteczność moich reguł i jakie jeszcze dodać. A co źle zrobiłem bo to że działa to nie znaczy że jest ok.

Moje wypociny:

Kod:

iptables -F
iptables -X

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

#INPUT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# xxx.xxx.xx.xxx <- DNS na CloudFlare
iptables -A INPUT -d xxx.xxx.xx.xxx -p udp --dport 53 -m state --state NEW -j ACCEPT
iptables -A INPUT -d xxx.xxx.xx.xxx -p udp --dport 53 -m state --state NEW -j ACCEPT
iptables -A INPUT -d xxx.xxx.xx.xxx -p tcp --dport 53 -m state --state NEW -j ACCEPT
iptables -A INPUT -d xxx.xxx.xx.xxx -p tcp --dport 53 -m state --state NEW -j ACCEPT

iptables -A INPUT -p tcp --dport 2222 -m state --state NEW  -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -m state --state NEW  -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT

iptables -A INPUT -p icmp -m icmp --icmp-type echo-request -m limit --limit 10/sec --limit-burst 20 -m conntrack --ctstate NEW -j ACCEPT #icmp-type 8
iptables -A INPUT -m limit --limit 1/sec --limit-burst 20 -j LOG --log-prefix "netfilter: "

iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -j LOG --log-prefix "INPUT DROP " --log-tcp-options --log-ip-options --log-tcp-sequence

#OUTPUT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT -d xxx.xxx.xx.xxx -p udp --dport 53 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -d xxx.xxx.xx.xxx -p udp --dport 53 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -d xxx.xxx.xx.xxx -p tcp --dport 53 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -d xxx.xxx.xx.xxx -p tcp --dport 53 -m state --state NEW -j ACCEPT


iptables -A OUTPUT -p tcp --sport 2222 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT

iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT

iptables -A OUTPUT -m state --state INVALID -j DROP
iptables -A OUTPUT -j LOG --log-prefix "OUTPUT DROP INVALID " --log-tcp-options --log-ip-options --log-tcp-sequence

Dostępne moduły jakie mogę wykorzystać.

Kod:

cat /proc/net/ip_tables_matches
helper
conntrack
conntrack
conntrack
limit
comment
mark
mark
connlimit
owner
string
string
addrtype
addrtype
recent
length
ttl
tcpmss
multiport
multiport
tos
tos
dscp
icmp
state
owner
udplite
udp
tcp

Do tego mam zainstalowany psad i fail2ban . Ale z tego co widzę to zużywają sporo ram . I zastanawiam się czy by je czymś  mniej zasobożernym nie zastąpić.

Kod:

PID   USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND       
32151 www-data  20   0  263m  65m  43m S   0,0  6,4   0:17.14 php5-fpm                                                                                                
32152 www-data  20   0  264m  61m  38m S   0,0  6,0   0:16.16 php5-fpm                                                                                                
32395 www-data  20   0  260m  53m  34m S   0,0  5,2   0:10.55 php5-fpm                                                                                                
28251 root      20   0 63808  15m 1484 S   0,0  1,5   1:17.36 psad                                                                                                    
 2170 mysql     20   0 94168  10m 2552 S   0,0  1,0   0:18.09 mysqld                                                                                                  
30539 root      20   0 80720 6788  980 S   0,0  0,6   1:00.82 fail2ban-server                                                                                         
32149 root      20   0  243m 4728 1308 S   0,0  0,5   0:05.95 php5-fpm                                                                                                
  658 root      20   0 71252 3496 2704 S   0,0  0,3   0:00.03 sshd                                                                                                    
32177 www-data  20   0 65088 2972 1164 S   0,0  0,3   0:00.89 nginx

w psad zmieniałem tylko:
/etc/psad/psad.conf

Kod:

ENABLE_AUTO_IDS Y
AUTO_IDS_DANGEL_LEVEL  3

W fail2ban

Kod:

# wpisałem ip DNS 
ignoreip=

[nginx-auth]
enabled = true
filter = nginx-auth
action = iptables-multiport[name=NoAuthFailures, port="http,https"]
logpath = /var/log/nginx/error.log
bantime = 43200 #Blokujemy dostęp na 12h
maxretry = 3

filer.d/nginx-auth

Kod:

[Definition]
failregex = no user/password was provided for basic authentication.*client: 
              user .* was not found in.*client: 
              user .* password mismatch.*client: 
ignoreregex =

Dodatkowo zablokowałem konto root do logowania z ssh i zmieniłem port. Ale na razie nie używam klucza bo co np gdy go stracę jak się wtedy dostane na serwer ?
Na serwerze są tylko moje strony na WordPressie każda ma swojego użytkownika. np. /home/user_1/  <- chmod 711 /home/user1/public_html <- chown -R user_1:www-data  /home/user_1/public_html <- chmod 2755
I jeszcze nginx.conf i default.

Kod:

user www-data;
worker_processes 1;
pid /var/run/nginx.pid;

events {
        worker_connections 768;
        # multi_accept on;
}

http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 5;
        client_body_timeout 60;
        client_header_timeout 60;
        send_timeout 60;
        types_hash_max_size 2048;
        # server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;


        # Zaawansowana optymalizacja
        open_file_cache max=1000 inactive=20s;
        open_file_cache_valid 30s;
        open_file_cache_min_uses 2;
        open_file_cache_errors on;

        ##
        # Gzip Settings
        ##

        gzip on;
        gzip_disable "msie6";
         gzip_vary on;
         gzip_proxied any;
         gzip_comp_level 4;
         gzip_buffers 16 8k;
         gzip_http_version 1.1;
         gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

        ##
        # nginx-naxsi config
        ##
        # Uncomment it if you installed nginx-naxsi
        ##

        #include /etc/nginx/naxsi_core.rules;

        ##
        # nginx-passenger config
        ##
        # Uncomment it if you installed nginx-passenger
        ##

        #passenger_root /usr;
        #passenger_ruby /usr/bin/ruby;

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;

        include /etc/nginx/sites-enabled/*;
}

Kod:

server {
        listen   80; ## listen for ipv4; this line is default and implied
        #listen   [::]:80 default_server ipv6only=on; ## listen for ipv6

        root /home/user/public_html;
        index index.php index.html index.htm;

        # Make site accessible from http://localhost/
        server_name domena.pl www.domena.pl;

        set $cache_uri $request_uri;

        # Make sure files with the following extensions do not get loaded by nginx because nginx would display the source code, and these files can contain PASSWORDS!
        location ~* \.(engine|inc|info|install|make|module|profile|test|po|sh|.*sql|theme|tpl(\.php)?|xtmpl)$|^(\..*|Entries.*|Repository|Root|Tag|Template)$|\.php_
        {
                return 444;
        }
        #passwd
        location  /wp-admin/  {
        auth_basic            "Admin area password";
        auth_basic_user_file  /etc/nginx/htpasswd;
        }
        location  /wp-login.php  {
          auth_basic            "Admin area password";
          auth_basic_user_file  /etc/nginx/htpasswd;
         }

#nocgi
location ~* \.(pl|cgi|py|sh|lua)\$ {
       return 444;
}

location ~ /(\.|wp-config.php|readme.html|license.txt) { deny all; }

location ~* /(?:uploads|files)/.*(\.|php|js|html|tpl|sh)$ {
       deny all;
}
location ~ ^/wp-content/cache/minify/[^/]+/(.*)$ {
                try_files $uri /wp-content/plugins/w3-total-cache/pub/minify.php?file=$1;
        }
location / {
                try_files /wp-content/cache/page_enhanced/${host}${cache_uri}_index.html $uri $uri/ /index.php?$args ;
        }
# POST requests and urls with a query string should always go to PHP
        if ($request_method = POST) {
                set $cache_uri 'null cache';
        }
        if ($query_string != "") {
                set $cache_uri 'null cache';
        }
# Don't cache uris containing the following segments
        if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
                set $cache_uri 'null cache';
        }
# Don't use the cache for logged in users or recent commenters

     if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {
                set $cache_uri 'null cache';
        }
# Don't use the cache for logged in users or recent commenters
        if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_logged_in") {
                set $cache_uri 'null cache';
        }
        rewrite ^(.*)?/?files/(.*) /wp-content/blogs.php?file=$2;
if (!-e $request_filename) {
              rewrite ^([_0-9a-zA-Z-]+)?(/wp-.*) $2  break;
              rewrite ^([_0-9a-zA-Z-]+)?(/.*\.php)$ $2 last;
              rewrite ^ /index.php last;
          }
rewrite ^/sitemap_index\.xml$ /index.php?sitemap=1 last;
rewrite ^/([^/]+?)-sitemap([0-9]+)?\.xml$ /index.php?sitemap=$1&sitemap_n=$2 last;
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
        #       # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
        #
        #       # With php5-cgi alone:
        #       fastcgi_pass 127.0.0.1:9000;
        #       # With php5-fpm:
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }
}

Wiem chaotycznie to wygląda.


Czym się jeszcze zainteresować o czym poczytać żeby zwiększyć swoje bezpieczeństwo ?

Pozdrawiam

jmp

Ostatnio edytowany przez jmp (2015-02-16 16:07:23)

Offline

 

#2  2015-02-16 17:11:09

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/urandom
Zarejestrowany: 2008-01-07

Re: iptables + psad + fail2ban można zrobić to lepiej ? nginx + php-fpm

Fail2ban  i Psad to stara szkoła, bardziej pasująca do starego Ipchains, niż do współczesnego Netfiltera.

Zobacz, czy masz dostępne moduły Netffiltera:

hashlimit
connlimit
recent
set (moduł dopasowania)
SET (cel)[/quote]
Radziłbym się z nimi mocno i gruntownie  zaprzyjaźnić.

To jest dużo mocniejsza i pewniejsza  broń, niż Psad i Fail2ban.

Poza tym w Nginxie masz moduły do limitowania dostępu i prędkości pobierania (per IP), radziłbym się też  z nimi  lepiej zaprzyjaźnić.

Wszystko masz w dokumentacji Nginxa:
http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html
http://nginx.org/en/docs/http/ngx_http_limit_req_module.html

Do panelu Admina w Wordpressie radziłbym użyć kontroli dostępu ssl, zrobisz to  certyfikatem ssl w formacie p12.
Na takie zabezpieczenie jak na razie nie ma zbyt skutecznych sposobów włamu.

Tu masz przykład:
http://blog.nategood.com/client-side-certificate-authentication-in-ngi
A tu dokumentację:
http://nginx.org/en/docs/http/ngx_http_ssl_module.html

Pozdro
;-)

Ostatnio edytowany przez Jacekalex (2015-02-16 17:18:12)


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

#3  2015-02-16 17:36:36

  jmp - Użytkownik

jmp
Użytkownik
Zarejestrowany: 2015-02-16

Re: iptables + psad + fail2ban można zrobić to lepiej ? nginx + php-fpm

Dziękuje. Będzie o czym czytać, teraz mam czas bo słabo sypiam odkąd odwiedził mnie pierwszy chiński boot a było to już 1 dzień po kupnie VPS szczęśliwie miałem już fail2ban i go zbanował ale czort wie co tam się dzieje a o czym nie mam pojęcia.

Offline

 

#4  2015-02-16 17:55:56

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/urandom
Zarejestrowany: 2008-01-07

Re: iptables + psad + fail2ban można zrobić to lepiej ? nginx + php-fpm

[quote=jmp]Dziękuje. Będzie o czym czytać, teraz mam czas bo słabo sypiam odkąd odwiedził mnie pierwszy chiński boot a było to już 1 dzień po kupnie VPS szczęśliwie miałem już fail2ban i go zbanował ale czort wie co tam się dzieje a o czym nie mam pojęcia.[/quote]
Na booty mam taki patent z Ipsetem:
https://forum.dug.net.pl/viewtopic.php?pid=269383

Do tego radzilbym drugi patent, np tworzysz w Nginxie regułkę, żeby zwracał 403 na zapytanie phpmyadmin albo phppgadmin albo podobny, do tego jakiś skrypt, który z loga Ngixa wyciąga adres Ip i dodaje do tablicy zbanowanych adresów.

Możesz to zrobić w oparciu o sysloga:
http://nginx.org/en/docs/syslog.html

Rsyslog może odpalać skrypty i wysyłać do nich kawałki loga.

Możesz też skołować Nginxa z modułem mod_security z Apacha, i tam można kombinować z filtrami i też chyba podpinać skrypty (mam takiego na Gentoo - skompilowany przez Portage).

https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#exec
I cała dokumentacja:
https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual
a tu kawałek o instalacji do Nginxa:
https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#Installation_for_NGINX

Ostatnio edytowany przez Jacekalex (2015-02-16 17:58:14)


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

#5  2015-02-16 18:44:05

  mati75 - Psuj

mati75
Psuj
Skąd: default city
Zarejestrowany: 2010-03-14
Serwis

Re: iptables + psad + fail2ban można zrobić to lepiej ? nginx + php-fpm

[quote=Jacekalex]Do tego radzilbym drugi patent, np tworzysz w Nginxie regułkę, żeby zwracał 403 na zapytanie phpmyadmin albo phppgadmin albo podobny, do tego jakiś skrypt, który z loga Ngixa wyciąga adres Ip i dodaje do tablicy zbanowanych adresów.[/quote]
Patent jest o tyle dobry, że 10 minut temu testując pewne rozwiązanie sam się zbanowałem, przynajmniej mam dostęp fizyczny do maszyny to obyło się przez krzyku. Dlatego warto dać allow na swój adres.

Ostatnio edytowany przez mati75 (2015-02-16 21:57:40)


[img]https://l0calh0st.pl/obrazki/userbar.png[/img]

Offline

 

#6  2015-02-16 19:47:26

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/urandom
Zarejestrowany: 2008-01-07

Re: iptables + psad + fail2ban można zrobić to lepiej ? nginx + php-fpm

Dla swojej maszyny, to wtedy, jak masz stały IP a nie jakieś neoszajsy, albo przynajmniej losowany z małej klasy IP, gdzie możesz wpuścić adresu ISP z maską np /16.

Lepiej mieć na jakimś porcie wylosowanym w totka ;)  (i trudnym do namierzenia nmapem) SSH po kluczu rsa|dsa|ecdsa na takie przypadki

Ostatnio edytowany przez Jacekalex (2015-02-16 20:06:49)


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

#7  2015-03-01 16:01:09

  jmp - Użytkownik

jmp
Użytkownik
Zarejestrowany: 2015-02-16

Re: iptables + psad + fail2ban można zrobić to lepiej ? nginx + php-fpm

Czy da się zrobić dostęp do ssl tylko z kluczem p12 a bez klucza error 403 ?

Próbowałem to osiągnąć za pomocą  if ( $ssl_client_verify != SUCCESS ) ale albo robię to źle albo trzeba to może zrobić w inny sposób.

Na razie osiągnąłem tyle co nic bo tylko kłódka świeci na zielono jak mam p12 ustawione w chrome i ssl działa tylko w panelu admina.

A tak już całkiem idealnym rozwiązaniem by było https na całej stronie a dostęp do panelu admina wyłącznie z kluczem p12 ale zadowolę się 1 sposobem.

Kod poniżej:

Kod:

server {
    listen        443 ;
    ssl on;
    server_name xxx.pl www.xxx.pl;
     root           /home/xxx/public_html;
   ssl_certificate      /etc/nginx/certs/server.crt;
    ssl_certificate_key  /etc/nginx/certs/server.key;
    ssl_client_certificate /etc/nginx/certs/ca.crt;
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
   ssl_prefer_server_ciphers on;
   ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;


   # set $ssl_client_s_dn_cn "";

    ssl_verify_client  on;
#    ssl_session_cache       shared:SSL:10m;
#    ssl_session_timeout     5m;
    ssl_verify_depth 1;

# set $ssl_client_s_dn_cn "";

#ssl_trusted_certificate /etc/nginx/certs/ca.crt;

#location  ~* {
if ( $ssl_client_verify != SUCCESS )
{

 return 403;
}
#}
    location / {
         fastcgi_split_path_info ^(.+\.php)(/.+)$;

        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_param  SCRIPT_FILENAME /home/xxx/public_html/wp-login.php;
       fastcgi_param  SSL_VERIFIED $ssl_client_verify;
fastcgi_param SSL_CLIENT_CERT $ssl_client_cert;
  fastcgi_param  DN $ssl_client_s_dn;
        include        fastcgi_params;
    }

}

Offline

 

#8  2015-03-01 16:05:56

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/urandom
Zarejestrowany: 2008-01-07

Re: iptables + psad + fail2ban można zrobić to lepiej ? nginx + php-fpm

W konfiguracji virtualhosta:

Kod:

        ssl on;
        ssl_verify_client on; 
        ssl_verify_depth 5;

Przy czym nie zwróci 403, zawsze odpowiedź jest jedna:

Kod:

400 Bad Request
No required SSL certificate was sent
nginx

Wynika to ze specyfiki połączenia SSL, po prostu najpierw zaczyna się szyfrowanie połączenia i weryfikacja certu, a dopiero później kontrola dostępu, która może zwrócić 403.

Certyfikat SSL może być z tego powodu tylko 1 na jedno IP, dlatego najczęściej pakuję globalnie w kontekście http, np:

Kod:

    ssl_certificate /etc/ssl/nginx/nginx.pem;
    ssl_certificate_key /etc/ssl/nginx/nginx.pem;
    ssl_client_certificate /etc/ssl/nginx/nginxCA.crt;
    
    ssl_prefer_server_ciphers On;
    ssl_protocols TLSv1.2;
    ssl_ciphers 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4';

Ostatnio edytowany przez Jacekalex (2015-03-01 16:46:27)


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

#9  2015-03-01 16:57:16

  jmp - Użytkownik

jmp
Użytkownik
Zarejestrowany: 2015-02-16

Re: iptables + psad + fail2ban można zrobić to lepiej ? nginx + php-fpm

Dalej mi to nie działa. Strona chodzi bez klucza p12 po https normalnie zaloguje się do panelu.

Może ma to jakiś związek z CloudFlare ? Niby ustawione mam tam ssl na Full.

Kod:

server {
    listen        443 ;
    ssl on;
    server_name xxx.pl www.xxx.pl;
     root           /home/xxx/public_html;
   ssl_certificate      /etc/nginx/certs/server.crt;
    ssl_certificate_key  /etc/nginx/certs/server.key;
    ssl_client_certificate /etc/nginx/certs/ca.crt;

   ssl_prefer_server_ciphers on;
 ssl_protocols TLSv1.2;
 ssl_ciphers 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4';


    ssl_verify_client  on;
    ssl_verify_depth 5;

if ( $ssl_client_verify != SUCCESS )
{

 return 400;
}

    location / {
         fastcgi_split_path_info ^(.+\.php)(/.+)$;

        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_param  SCRIPT_FILENAME /home/xxx/public_html/wp-login.php;
       fastcgi_param  SSL_VERIFIED $ssl_client_verify;
fastcgi_param SSL_CLIENT_CERT $ssl_client_cert;
  fastcgi_param  DN $ssl_client_s_dn;
        include        fastcgi_params;
    }


}

Offline

 

#10  2015-03-01 17:00:47

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/urandom
Zarejestrowany: 2008-01-07

Re: iptables + psad + fail2ban można zrobić to lepiej ? nginx + php-fpm

To wywal:

Kod:

if ( $ssl_client_verify != SUCCESS )
{

 return 400;
}

Po prostu pacjent wejdzie na stronę tylko jak weryfikacja certu da wynik SUCCES, w przeciwnym razie w ogóle nie wejdzie na stronę.

I nie próbuj dawać  tego samego albo różnych certów w rożnych virtualhostach, bo wtedy Ci cały Nginx zdurnieje, jeśli wiszą te vhosty na jednym IP.


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

#11  2015-03-01 17:18:36

  jmp - Użytkownik

jmp
Użytkownik
Zarejestrowany: 2015-02-16

Re: iptables + psad + fail2ban można zrobić to lepiej ? nginx + php-fpm

usunąłem ale efekt dalej ten sam strona.pl error 400 a strona.pl/wp-admin działa bez klucza p12 czyli dalej porażka . a ssl próbuje na razie tylko zrobić dla tej jednej subdomeny i tego jednego panelu.

A tak w ogóle dlaczego ssl_verify_depth 5;  gdzie to jest opisane ? bo i widywałem w konfiguracjach 2 lub 1

Offline

 

#12  2015-03-01 18:21:18

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/urandom
Zarejestrowany: 2008-01-07

Re: iptables + psad + fail2ban można zrobić to lepiej ? nginx + php-fpm

SSL dzaiała per vhost, musiałbyś wywołanie do wp-admin/ przekierować na innego vhosta np root.domenat.tld, i tam dopiero zrobić p12.

W Nginxie każdy vhost zamyka się w znacznikach, może mieć inną nazwę domeny i inny adres oraz port (tak samo, jak Virtualhost w Apache).

Kod:

server { 
}

Np wywalenie w Nginxie logowania do Wordpressa na TLS (może być z p12):

Kod:

location = /wp-login.php  {
         deny  all; 
         error_page   403  =  https://blog.domena.tld/wp-login.php;
        log_not_found off; access_log off;}
     
        location = /wp-admin/  {
         deny  all; 
         error_page   403  =  https://blog.domena.tld/wp-admin/;
        log_not_found off; access_log off;}

W samym WP (w konfigu) możesz:

Kod:

 define('FORCE_SSL_LOGIN', true);
 define('FORCE_SSL_ADMIN', true);

Przy czym w samym WP nie ustalisz panelu admina na innym vhoście, to musisz wyrzeźbić w Nginxie, np przez stronę 403

Ostatnio edytowany przez Jacekalex (2015-03-01 20:47:05)


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

#13  2015-03-01 22:50:50

  jmp - Użytkownik

jmp
Użytkownik
Zarejestrowany: 2015-02-16

Re: iptables + psad + fail2ban można zrobić to lepiej ? nginx + php-fpm

No ale tak po zastanowieniu nie wiem czy mnie dobrze zrozumiałeś. Cały dostęp po ssl ma być wyłącznie dostępny z kluczem p12 a w przypadku kodu nginx jaki podałem już w poscie wyżej tak nie jest.
Dostęp do strony jest zablokowany prócz dostępu do strona.pl/wp-admin lub wp-login.php
Czemu to nie podchodzi pod blokowanie cała zawartość "root           /home/xxx/public_html;"? Czemu to nie działa tylko z p12 ?


A co do WordPress to ja mam takie cus.

Kod:

define('FORCE_SSL_ADMIN', true);
if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
       $_SERVER['HTTPS']='on';

Offline

 

#14  2015-03-01 23:13:40

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/urandom
Zarejestrowany: 2008-01-07

Re: iptables + psad + fail2ban można zrobić to lepiej ? nginx + php-fpm

Nie wiem, co tam masz spaprane.

U mnie wsio działa elegancko, blog się wyświetla bez problemu z szyfrowaniem lub bez ale próba zalogowania kończy się  żądaniem certyfikatu P12.
Konfig do Wordpressa?

Kod:

 
 server {
        server_name blog.domena.tld;
        root /home/www/blog/Wordpress4;
        listen 0.0.0.0:80;
        listen [::]:80;
        index index.php;
     
        location = /wp-login.php  {
         deny  all; 
         error_page   403  =  https://admin.domena.tld/wp-login.php;
        log_not_found off; access_log off;}
     
        location = /wp-admin/  {
         deny  all; 
         error_page   403  =  https://admin.domena.tld/wp-admin/;
        log_not_found off; access_log off;}

        location = /(favicon.ico|robots.txt|sitemap.xml) {log_not_found off; access_log off;}
 
 
        location / {
                try_files $uri $uri/ /index.php?$args;
        }
 
 
        location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
                expires max;
                log_not_found off;
        }
        
         location ~ [^/]\.php(/|$) {    
            fastcgi_split_path_info ^(.+?\.php)(/.*)$;
                if (!-f $document_root$fastcgi_script_name) {
                        return 404;
                }
 
         
            include /etc/nginx/fastcgi.conf;  ##Includes our fastcgi setup
            fastcgi_pass unix://var/run/php55.sock; 
            fastcgi_index index.php;

            }    
        
}

 
server {
        server_name blog.domena.tld;
        root /home/www/blog/Wordpress4;
         listen 0.0.0.0:443;
         listen [::]:443;
        index index.php;
        
         ssl on;

         location = /wp-login.php  {
         deny  all; 
         error_page   403  =  https://admin.domena.tld/wp-login.php;
         log_not_found off; access_log off;}
     
         location = /wp-admin/  {
         deny  all; 
         error_page   403  =  https://admin.domena.tld/wp-admin/;
         log_not_found off; access_log off;}


        location = /(favicon.ico|robots.txt|sitemap.xml) { log_not_found off; access_log off; }
 
        location / {
                # This is cool because no php is touched for static content. 
                # include the "?$args" part so non-default permalinks doesn't break when using query string
                try_files $uri $uri/ /index.php?$args;
        }
 
 
        location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
                expires max;
                log_not_found off;
        }
        
        location ~ [^/]\.php(/|$) {    
            fastcgi_split_path_info ^(.+?\.php)(/.*)$;
                if (!-f $document_root$fastcgi_script_name) {
                        return 404;
                }
 
         
            include /etc/nginx/fastcgi.conf;  ##Includes our fastcgi setup
            fastcgi_pass unix://var/run/php55.sock;  
            fastcgi_index index.php;

            }    
        
}


server {
        server_name admin.domena.tld;
        root /home/www/blog/Wordpress4;
         listen 0.0.0.0:443;
         listen [::]:443;
        index index.php;
        
        ssl on;
        ssl_verify_client on; 
        ssl_verify_depth 5;


        location = /(favicon.ico|robots.txt|sitemap.xml) { log_not_found off; access_log off; }
 
        location / {
                try_files $uri $uri/ /index.php?$args;
        }
 
 
        location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
                expires max;
                log_not_found off;
        }
        
        location ~ [^/]\.php(/|$) {    
            fastcgi_split_path_info ^(.+?\.php)(/.*)$;
                if (!-f $document_root$fastcgi_script_name) {
                        return 404;
                }
 
         
            include /etc/nginx/fastcgi.conf;  ##Includes our fastcgi setup
            fastcgi_pass unix://var/run/php55.sock;  
            fastcgi_index index.php;

            }    
        
}

Do tego do pliku konfiguracyjnego WP dodać:

Kod:

define('WP_SITEURL', 'https://' . $_SERVER['HTTP_HOST']);
define('WP_HOME', 'https://' . $_SERVER['HTTP_HOST']);

Wtedy wyświetla się na każdej domenie i subdomenie, domenami zajmuje się serwer WWW.
I GOTOWE. :)

Rezultat  próby logowania:
http://s4.postimg.org/78zzlv6v1/Wordpress_P12.png

SOA#1

Ostatnio edytowany przez Jacekalex (2015-03-02 01:02:50)


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

#15  2015-03-02 13:46:40

  jmp - Użytkownik

jmp
Użytkownik
Zarejestrowany: 2015-02-16

Re: iptables + psad + fail2ban można zrobić to lepiej ? nginx + php-fpm

SSL certificate verify ok. to gdzie może być problem ?


Kod:

curl -v -s -k --key client.key --cert client.crt https://xxx.pl
* About to connect() to xxx.pl port 443 (#0)
*   Trying xxx.31.xx.x0...
* connected
* Connected to xxx.pl (xxx.x1.x0.x0) port 443 (#0)
Enter PEM pass phrase:
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server key exchange (12):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using ECDHE-ECDSA-AES128-GCM-SHA256
* Server certificate:
*      subject: OU=Domain Control Validated; OU=PositiveSSL Multi-Domain; CN=snixx0x9.cloudflaressl.com
*      start date: 2015-02-11 00:00:00 GMT
*      expire date: 2015-09-30 23:59:59 GMT
*      issuer: C=GB; ST=Greater Manchester; L=Salford; O=COMODO CA Limited; CN=COMODO ECC Domain Validation Secure Server CA 2
*      SSL certificate verify ok.
> GET / HTTP/1.1
> User-Agent: curl/7.26.0
> Host: xxx.pl
> Accept: */*
> 
* additional stuff not fine transfer.c:1037: 0 0
* HTTP 1.1 or later with persistent connection, pipelining supported
< HTTP/1.1 400 Bad Request
< Server: cloudflare-nginx
< Date: Mon, 02 Mar 2015 12:38:55 GMT
< Content-Type: text/html
< Transfer-Encoding: chunked
< Connection: keep-alive
< Set-Cookie: __cfduid=de233ed5eaxxe741fb601bc66xxcc88c01425xx9935; expires=Tue, 01-Mar-16 12:38:55 GMT; path=/; domain=.xxx.pl; HttpOnly
< CF-RAY: 1c0d2955x7e61axx-DUS
< 
<html>
<head><title>400 No required SSL certificate was sent</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<center>No required SSL certificate was sent</center>
<hr><center>nginx/1.2.1</center>
</body>
</html>
* Connection #0 to host xxx.pl left intact
* Closing connection #0
* SSLv3, TLS alert, Client hello (1):

Offline

 

#16  2015-03-02 14:33:05

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/urandom
Zarejestrowany: 2008-01-07

Re: iptables + psad + fail2ban można zrobić to lepiej ? nginx + php-fpm

Jak wchodzisz z przeglądarki, np Firefoxa, Chrome albo Opery, to co?
Curl i Wget u mnie jakoś nie chciały łykać certyfikatów, ale za bardzo się w to nie zagłębiałem, bo mi to psu na budę, mam ciekawsze zajęcia.

Poza tym zabawa certyfikatami SSL, to wyższa szkoła jazdy, nie zawsze działają, jak powinny, mnie też się czasem zdarza 5 razy certy robić. :P

Ostatnio edytowany przez Jacekalex (2015-03-02 14:41:37)


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

#17  2015-03-02 15:42:25

  jmp - Użytkownik

jmp
Użytkownik
Zarejestrowany: 2015-02-16

Re: iptables + psad + fail2ban można zrobić to lepiej ? nginx + php-fpm

Kłódka zielona i 400 Bad Request No required SSL certificate was sent w chrome (p12 łykło bez problemów)
iceweasel ma dziwny błąd i nie łyka p12 (czytaj importuje klucz wpisuje hasło i pisze niezidentyfikowany błąd)

Jeszcze mnie zastanawia czy CloudFlare ma tu coś do gadania no ale jak jest zielona kłódka to chyba nie.

Cóż na razie będę jechał na opcji ssl_verify_client optional; i pomału będę próbował dalej aż się uda.

"Poza tym zabawa certyfikatami SSL, to wyższa szkoła jazdy, nie zawsze działają, jak powinny, mnie też się czasem zdarza 5 razy certy robić. :P"

Marne to pocieszenie skoro Tobie się zdarza to może ja pojechałem z motyką na słońce.

Ale dzięki za pomoc.  I za dobre chęci.

Offline

 

#18  2015-03-02 16:22:24

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/urandom
Zarejestrowany: 2008-01-07

Re: iptables + psad + fail2ban można zrobić to lepiej ? nginx + php-fpm

Pierwszy raz robiłem certy wg tego:
http://linuxconfig.org/apache-web-server-ssl-authentication

I nawet chodziły.

Ale zanim na Lighttpd działała prawidłowo autoryzacja, to były dwa dni zabawy.
Potem Apache i Nginx, już z górki, bo pasowały te same certy.

Masz tu skrypty, na których zrobiłem pierwsze certy przez OpenSSL:
https://drive.google.com/file/d/0BxnxcErK-vmSOG1ibUVmNllla0U/view?usp=sharing

Przed chwilą zrobiłem nimi CA i Certy/
Użycie:
We wszystkich skryptach i konfigu openssl zmienić nazwy domeny i organizacji, a takze hasełka.
Potem:

Kod:

./sslskrypcio2
./sslCA
./sslserver

Certy pacjentów:

Kod:

./clientcert pacjent hasełko

Weryfikacja:

Kod:

openssl verify -CAfile certs/domenaCA.crt certs/pacjent.crt 2>/dev/null

A tu masz howto, do robienia certów przy pomocy narzędzia certtool z pakietu Gnutls.
http://wiki.libvirt.org/page/TLSCreateCACert
Też mi się udało działające certy wyrzeźbić w ten sposób, nawet troszkę łatwiej, niż w OpenSSL. ;)


I pamiętaj podstawą prawdę:
"Póki kaczka dupy nie zamoczy, pływać się nie nauczy".

Pozdro
;-)

Ostatnio edytowany przez Jacekalex (2015-03-02 18:29:27)


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Nas ludzie lubią po prostu, a nie klikając w przyciski ;-)

[ Generated in 0.010 seconds, 11 queries executed ]

Informacje debugowania

Time (s) Query
0.00017 SET CHARSET latin2
0.00005 SET NAMES latin2
0.00059 SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='18.224.31.90' WHERE u.id=1
0.00111 REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '18.224.31.90', 1732812409)
0.00036 SELECT * FROM punbb_online WHERE logged<1732812109
0.00051 SELECT topic_id FROM punbb_posts WHERE id=283143
0.00028 SELECT id FROM punbb_posts WHERE topic_id=27041 ORDER BY posted
0.00035 SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=27041 AND t.moved_to IS NULL
0.00027 SELECT search_for, replace_with FROM punbb_censoring
0.00110 SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=27041 ORDER BY p.id LIMIT 0,25
0.00115 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=27041
Total query time: 0.00594 s