SSHD dla opornych* - HOWTO

Hunter

Użytkownik
Dołączył
Październik 29, 2005
Posty
478
########################################
# 1. brief '(x.0)'
########################################

--------------------------------------------------------------------------------
Co chcemy osiagnac? Mowiac wprost... korporacyjny standard pracy zdalnej... 6_^)
--------------------------------------------------------------------------------

home_static_IP (weryfikacja: crt vpn pass) ---> INTERNET ---> Router firma.com ---> (weryfikacja: src_ip) firewall linux /bsd ---> (weryfikacja: src_ip, dst_ip, crt vpn) vpn server ---> (weryfikacja: src_ip, crt rsa, crt ssh pass, usera ssh, pass ssh) www server linux / bsd --> LOGIN SUCCESSFUL!


[[ Security.note!: Nie laczymy sie z serwerem bedacym mostem mpls bgp (np. bird) dla pozostalych placowek korporacji. (to samo tyczy sie routerow mlx, mlps np. link). Uzywamy posrednich* serwerow z vpn bridge ]] more info / more info2 / more info3 / more info4

prosty przyklad bgp - problem w tym ze routery c7500 tworza miedzy soba most bgp (laczenie placowek) + sa rowniez bramami wan :/. Niestety jest mozliwosc przejecia np. autentykacji md5, mozemy zmienic trase routingu aby przejac wyslanego maila z placowki A do placowki B : ).
vpn-mpls-1.gif

* poprzez blokade skanowania portow ukryjemy dostepne uslugi/porty
* umozliwic laczenie sie na ssh ze statycznego adresu ip przez szyfrowane polaczenie VPN (prerouting)
* bedziemy musieli fizycznie posiadac wczesnieje wygenerowany certyfikat vpn oraz znac jego haslo.
* server VPN wew. sieci zezwoli nam tylko na 1 polaczenie tcp - 192.168.11.5:8900 nasze ssh :).
* na tym etapie bedziemy musieli fizycznie posiadac wygenerowany wczesniej certyfikat id_rsa_server oraz znac jego haslo.
* zalogujemy sie na konto ruser (bez podawania hasla dzieki ssh-add - opcja linux, lub peagent.exe - opcja windows)
* z poziomu uzytkownika ruser(na tym koncie dziala tylko /bin/login) zalogujemy sie na konto www_123 - dostep do: /bin/ls, /bin/pwd, /usr/bin/vi, /usr/bin/vim, /usr/bin/nano, /usr/bin/apache2, /etc/init.d/apache2, /bin/cat, /usr/sbin/useradd, /usr/sbin/groupadd, /usr/bin/passwd, /bin/netstat, /usr/bin/top, modyfikacja plikow/katalogow z grupa www_radmins. Konto te oczywiscie nie moze miec uprawnien do zmiany plikow innych niz konfiguracja apache2 skrypt uruchamijacy /etc/init.d/apache2.

Ok, so let's go to work...

########################################
# +. konfiguracja hasel
########################################

vi /etc/login.defs
Kod:
PASS_MAX_DAYS   25
PASS_MIN_DAYS   10
PASS_WARN_AGE   5
apt-get install libpam-cracklib ; vi /etc/pam.d/common-passwd

Kod:
password        requisite                       pam_cracklib.so retry=3 minlen=15 difok=5

Ustawilismy:

* maxymalna zywotnosc hasel na 25 dni
* wczesniejsza zmiana hasla mozliwa dopiero po 10 dniach od nadania hasla
* przypominanie 5 dni wstecz o konczacej sie zywotnosci hasla
* ilosc prob tworzenia hasla 3
* minimalna dlugosc hasla 15 znakow
* haslo musi posiadac minimum 5 roznych znakow


########################################
# 2. restrykcja userow sudo
########################################

groupadd www_radmins
echo "ruser server_name=(root) /bin/login" >> /etc/sudoers
echo "www_123 server_name=(www_radmins)NOPASSWD: /bin/ls, /bin/pwd, /usr/bin/vi, /usr/bin/vim, /usr/bin/nano, /usr/bin/apache2, /etc/init.d/apache2, /bin/cat, /usr/sbin/useradd, /usr/sbin/groupadd, /usr/bin/passwd, /bin/netstat, /usr/bin/top" >> /etc/sudoers

Ad.note jezeli *ktos nie zna sie na sudoers zalecam edytowanie go przy pomocy: visudo -f /etc/sudoers (w razie blednej interpretacji zostaniemy o tym poinformowani :) ). Przypominam ze "linux firewall" instalujemy bez kompilatorow oraz zabezpieczamy modyfikacje ARP np. ArpON more info.

(mozemy rowniez uzyc grupy uzywkonikow, wystarczy dodac: %nazwa_grupy server_name(www_radmins)...)

chgrp -R www_radmins /etc/apache2/* ; chmod 750 -R /etc/apache2 /etc/init.d/apache2 ; chgrp www_radmins /bin/ls /bin/pwd /usr/bin/vi /usr/bin/vim /usr/bin/nano /usr/bin/apache2 /etc/apache2 /bin/cat /etc/init.d/apache2 /usr/sbni/useradd /usr/sbin/groupadd /usr/bin/passwd /bin/netstat /usr/bin/top

########################################
# 3. dodajemy konto sluzace tylko do logowania na inne konto.
########################################

groupadd rugroup
ruseradd -g rugroup -s /bin/rbash -d /mnt/rbash_rusers4225/346fsdsa5werwce -m ruser
passwd ruser
[ podaj pass rusera ]


########################################
# 4. dodajemy konto administratora www.
########################################

groupadd www_admin
groupadd rugroup
ruseradd -g www_admin -s /bin/rbash -d /mnt/rbash_rusers4336/5345twdtfw4363w -m www_123
passwd www_123
[ podaj pass www_123 ]

chmod 700 /mnt/rbash_r*/*

Ad.note ...w roli scislosci /mnt/rbash_rusers* to osobne partycje z opcja montowania nosuid, nodev, noexec dla www_123, nosuid, nodev, noexec, ro dla ruser.


########################################
# 5. zabezpieczamy profile
########################################

chmod 700 ~ruser
echo >> ~ruser/.profile ; echo "PATH="/bin:/usr/bin"" >> ~ruser/.profile ; echo "export PATH" >> ~ruser/.profile ; chown root:rugroup ~ruser/.profile ~ruser/.bash_history ; chmod 640 ~ruser/.profile ; chattr +i ~ruser/.profile .bashrc ~ruser/.ssh/id_rsa_server ~ruser/.ssh/id_rsa_server.pub ; chmod 660 ~ruser/.bash_history ; chattr +a ~ruser/.bash_history

chmod 700 ~www_123
echo >> ~www_123/.profile ; echo "PATH="/bin:/usr/bin"" >> ~www_123/.profile ; echo "export PATH" >> ~www_123/.profile ; chown root:www_admin ~www_123/.profile ~www_123/.bash_history ; chmod 640 ~www_123/.profile ; chattr +i ~www_123/.profile .bashrc ; ~www_123/.ssh/id_rsa_server ~www_123/.ssh/id_rsa_server.pub ; chmod 660 ~www_123/.bash_history ; chattr +a ~www_123/.bash_history
echo >> PATH="/bin:/usr/bin" ; echo >> export PATH

########################################
# 6. ustawiamy restrykcje do /bin dla default acc
########################################

vi /etc/profile

kod:
Kod:
if [ "`id -u`" -eq 0 ]; then
  PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
  PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
fi
export PATH
zamieniamy na:
Kod:
if [ "`id -u`" -eq 0 ]; then
  PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
  PATH="/bin"
fi
export PATH


########################################
# 7. zabezpieczamy wrazliwe katalogi & auth.log
########################################

chmod 550 /bin/* /usr/bin/* ; chmod 555 /bin/bash /usr/bin/id /bin/login ; chmod 4755 /usr/bin/sudo ; chattr +i /bin/su /bin/bash /bin/rbash /bin/login /usr/bin/passwd /bin/bash /usr/bin/sudo ; chmod 640 /var/log/auth.log ; chattr +a /var/log/auth.log

Ad.note pamietajmy ze w korporacji zwykle nie uzywa sie konta su, jesli jednak zajdzie taka potrzeba to wystarczy: chgrp www_radmins /bin/su ; chmod 4750 /bin/su przed nadaniem atrybutu chattr +i


########################################
# 8. konfiguracja crt rsa
########################################

rm /etc/ssh/ssh_host_rsa* /etc/ssh/ssh_host_dsa* ; chmod 640 /etc/ssh/sshd_config
# tworzymy sshd rsa crt bez hasla w przeciwnym wypadku bedziemy musieli manualnie uruchamiac daemona wpisujac pass crt'a.

ssh-keygen -t rsa -b 4096 -f /etc/ssh/ssh_host_rsa_key ; chmod 640 /etc/ssh/ssh_host_rsa*
[ enter ]

ssh-keygen -t rsa -b 4096 -C optional_comment -f ~ruser/.ssh/id_rsa_server ; chmod 640 ~ruser/id_rsa*
[ podaj pass certu ]
cat ~ruser/id_rsa_server.pub >> ~ruser/authorized_keys ; chmod 644 ~ruser/authorized_keys


########################################
# 9. konfiguracja sshd
########################################

vi /etc/ssh/sshd_config

Port 8900
Protocol 2
HostKey /etc/ssh/ssh_ho
st_rsa_key
UsePrivilegeSeparation yes
KeyRegenerationInterval 3600
Ciphers 3des-cbc # ogromna strata przepustowosci scp ze wzgledu na silny algorytm szyfrowania
ServerKeyBits 4096
SyslogFacility AUTH
LogLevel INFO
PermitRootLogin no
StrictModes yes
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
IgnoreRhosts no
RhostsRSAAuthentication no
HostbasedAuthentication no
IgnoreUserKnownHosts yes
PermitEmptyPasswords no
ChallengeResponseAuthentication no
PasswordAuthentication no
KerberosAuthentication no
GSSAPIAuthentication no
AllowTcpForwarding no
X11Forwarding no
X11DisplayOffset 10
PrintMotd no
PrintLastLog yes
TCPKeepAlive no
AcceptEnv LANG LC_*
Subsystem sftp /usr/lib/openssh/sftp-server
UsePAM no
AllowUsers ruser www_123
Compression yes
LoginGraceTime 30
MaxAuthTries 3
MaxStartups 3

# zabezpieczamy przejecie aktywnej sesji ssh
ClientAliveCountMax 2
ClientAliveInterval 5


/etc/init.d/ssh restart or /etc/rc.d/sshd restart


########################################
# 10. logowanie z wykorzystaniem crt rsa
########################################

# od tej chwili zalogowac moga sie osoby ktore posiadaja certyfikat oraz znaja jego haslo.

eval `ssh-agent -k`
ssh-add ~jakis_user/.ssh/id_rsa_server
[ podaj pass certu ]
ssh -p 8900 [email protected]

Aby polaczyc w systemie windows musimy wczesniej wygenerowac id_rsa_server.ppk dla putt'iego.
w tym celu pobieramy puttygen + pageant:
http://tartarus.org/~simon/putty-snapshots/x86/puttygen.exe
http://tartarus.org/~simon/putty-snapshots/x86/pageant.exe

Puttygen:
W puttygen klikamy load certyficate, wybieramy SSH-RSA-2, wpisujemy 4096 bitow, zapisujemy jako private id_rsa_server.ppk

Pageant:
prawy klik myszki na pageant.exe, w "Element docelowy" dopisujemy uruchamianie sciezki wygenerowanego w puttygen.exe certyfikatu id_rsa.ppk C:\ssh\id_rsa_server2.ppk" etc. Logujemy sie jako ruser bez koniecznosci hasla :). Zamiast agenta mozna dodac recznie id_rsa_server.ppk w konfiguracji putty'iego - zakladka "Auth", dzieki temu bedziemy musieli za kazdym razem wpisywac reccznie haslo certyfikatu.

(W momencie uruchomienia, pageant.exe poprosi o podanie hasla dla wszystkich zaladowanych w ten sposob certyfikatow).


########################################
# 11. iptables "firewall linux" / dla zainterere moge przewalic reguly na bsd pf
########################################

(konfiguracja vpn - link)

##############
# iptables "firewall" #
#############


ext_if="eth0"
int_if="eth1"
iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# antiportscan nmap fu<kyea :eek:
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A FORWARD -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state INVALID -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP
iptables -A INPUT -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "portscan:"
iptables -A INPUT -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP

# dodamy warunek dla ext_if aby blokowac skanowanie na zew. bez tego linux bedzie blokowal lokalne stacje z polaczeniami smb (czyli ktos do was zadzwoni i zapyta sie "dlaczego #!@%^$%@#$#@ nie mam internetu,sieci etc????, dmesg |grep portscan i wiadomix ;-0)
iptables -A FORWARD -i $ext_if -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "portscan:"
iptables -A FORWARD -i $ext_if -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP
iptables -A INPUT -m recent --name portscan --rcheck --seconds 86400 -j DROP
iptables -A FORWARD -m recent --name portscan --rcheck --seconds 86400 -j DROP
iptables -A INPUT -m recent --name portscan --remove
iptables -A FORWARD -m recent --name portscan --remove

# Statyczny prerouting na vpn server
wan="${curl ifconfig.me}"
iptables -t nat -A PREROUTING -s my.dyndns.domain.com -d $wan -p udp --dport 5900 -j DNAT --to-destination 192.168.11.20:5900

################
# iptables "vpn server" #
###############


ext_if="eth0"
int_if="eth1"
iptables -P INPUT DROP
iptables -A INPUT -s my.dyndns.domain.com -p udp --dport 5900 -j ACCEPT
iptables -A FORWARD -i tun+ -m iprange --src-range 10.10.5.5-10.10.5.10 -d 192.168.11.5 -p tcp --dport 8900 -j ACCEPT


#################
# iptables "www server" #
################

udostepniamy ssh dla IT vpn users

ext_if="eth0"
int_if="eth1"
iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i $int_if -m iprange --src-range 10.10.5.5-10.10.5.10 -p tcp --dport 8900 -j ACCEPT


########################################
# 12. logowanie & wykonywanie polecen na restrykcyjnych kontach
########################################

ruser:
sudo login www_123
[ podajemy pass ruser ]
[ podajemy pass do www_123 ]

www_123:
sudo -u www_radmins nano /etc/apache2/apache2.conf
sudo -u www_radmins /etc/init.d/apache2 restart itp. itd. :) (dzieki opcji NOPASSWD w /etc/sudoers mozemy wykonywac sudo bez podawania hasla)
 
Ostatnia edycja:
Do góry Bottom