Agent forwarding ssh-add
If you want to load the keys in your session and use it in a jump host.
You have your .ssh/id_rsa default key to login in the first jump host, but from there you want to use your my_other_private_key to login to the second step and you don't want to store in the jump host because it is not secure.
For first of all from your machine, you need to add your private key
ssh-add .ssh/my_other_private_key
now you can login to your jump host but don't forget to add the option -A to enable agent forwarding at client level
ssh -A my_username@my_jumphost.com
now you are inside the jump host and you can jump without providing any key to the second machine
ssh another_username@my_second_node.private
Managing ssh-add client level
you can check the list of keys you have already loaded with the command
ssh-add -l
you can remove all the keys with the command
ssh-add -D
All identities removed.
in this case the list will be empty
ssh-add -l
The agent has no identities.
Server level
if AllowAgentForwarding is set to to no agent forwarding will not wo
grep AllowAgentForwarding /etc/ssh/sshd_config
#AllowAgentForwarding yes
SSHPASS
From linuxacademy nuggets
It is less secure of key exchange but it can be used where it is not possible do a key exchange
sudo apt-get install sshpass
sshpass -p '123456' ssh -o StrictHostKeyChecking=no user@destination-name-or-ip
rsync using sshpass
rsync --rsh="sshpass -p '123456' ssh -o StrictHostKeyChecking=no -l user" destination-name-or-ip:/dir/to/copy/myfile.txt myfile.txt
Restriction
thanks to http://askubuntu.com/questions/45679/ssh-connection-problem-with-host-key-verification-failed-error
If you are running in certain remote/scripting situations where you lack interactive access to the prompt-to-add-hostkey, work around it like this:
$ ssh -o StrictHostKeyChecking=no user@something.example.com uptime
ssh utente@hostname #per loggarmi sulla macchina remota
scp file_locale utenteremoto@ip:/dir
#in questo modo se sono loggato su una macchina posso trasferire file_locale nell'altra. Quella locale è quella dove sono loggato e non quella dove sono seduto fisicamente
IMPORTANTE funziona come il cp normale cp sorgente destinazione solo che si possono prendere file remoti mettendo le informazioni in più
è nato per i sitemi bsd ma ci sono i porting
open ssh
supporta due tipi di famiglie
1 deprecaped attaccabile
2 molto resistente
Moduli
ssh utilizza crittografia simmetrica e asimmetrica
sshd è il demone
ssh il client
scp per copiare i file in remoto
sftp per fare il traffico ftp per non passare le pwd in chiaro
Login con le chiavi
Serve per avere il login automatico quindi non va inserita passphrase
Passi in ordine:
Server
su - username-server
ssh-keygen -b 2048 -t rsa
cd .ssh/
scp id_rsa username-client@ip-client:/home/username-client
cat id_rsa.pub >> authorized_keys
chmod 600 authorized_keys
Client
mkdir ~/.ssh
mv ~/id_rsa ~/.ssh
#poi provare se il collegamento va a buon fine senza password
ssh username-server@ip-server
Molto importante il file authorized_keys deve avere permessi di lettura e scrittura solo del proprietario altrimenti non funziona
-rw------- 1 www www 821 30 apr 2012 authorized_keys
vengono generati una coppia di chiavi simmetrica e asimmetrica
/etc/ssh ci sono tutti i file di config
- ssh_host_rsa_key chiave privata generata dal daemon, lo stesso file con .pub quella pubblica , lo stesso invece di rsa con dsa per la crittografia simmetrica
- ssh-keygen -t tipo per generare le chiavi
Per il login automatico deve essere messo sulla macchina dove ci si vuole loggare dentro la cartella .ssh la chiave pubblica rinominata con authorized_keys , oppure in append allo stesso file se questo esiste già.
Sulla propria macchina invece va la chiave privata che va rinominata in base al protocollo che si sta usando id_dsa o id_rsa per esempio.
Chiavi multiple
In caso di autenticazioni multiple ci possono essere
cat ~/.ssh/config
Host ip-uno
IdentityFile ~/.ssh/id_rsa-uno
User backup
Port 22322
Host ip-due
IdentityFile ~/.ssh/id_rsa-due
User backup
Port 2222
per fare login ssh ip-uno o ssh ip-due
Parametri
ssh -2 forz ad usare la versione 2 o 1 se metto 1
ssh -l nome_utente hostname questo dal lato client
scp utente@loclahost:/file utente2@hostname:/directory
se siamo già loggati possiamo scrivere scp /file utente2@hostname:/directory perchè della mia macchina so già l'indirizzo
TUNNELING
(ci sono due computer un server che manda tutto alla porta e il client dove i programmi sono attivi, nel mezzo si costruisce un tunnel criptato)
ssh - l localport:host:hostport user@host
hostport è la porta del server
host indirizzo ip o nome del server
-c attiva la compressione -t è fondamentale perchè non da la shell
ssh -X user@macchina #in questo modo vengono reindirizzati alla propria macchina le sessioni grafiche , per esempio se lancio acroread posso usare il suo sulla mia macchina. Ovviamente se vado da mac a linux devo usare X11 come shell
Da approfondire
http://www.voipandhack.it/archives/linux/vpn-tunneling-con-openssh
http://www.voipandhack.it/archives/linux/openssh-tunneling-layer2-vpn
Se si vuole solo aprire il tunnel senza shell e farsi restituire il prompt perchè per esempio si vuole lanciarlo con uno script
ssh -N ip-macchina-da-ponte -L ip-dacuivoglioesporre:portadacuivoglioesporre:ipdestinazionefinale:portafinale &
Esempio di tunnel
ssh ipremoto -L 8080:localhost:10080
Sulla mia macchina alla porta 8080 risponde la porta della macchina remota che apre un tunnel dal suo localhost alla porta 10080.
Localhost indica l'indirizzo su cui viene fatto il tunnel visto dalla macchina destinataria.
Se voglio mappare in modo che non sono solo io a vedere quella porta ma per esempio tutte le macchine sulla mia rete locale devo mettere ip di bind address per esempio
ssh utenteremoto@14.255.255.107 -L 192.168.9.85:18080:localhost:18080
192.168.9.85 è il mio ip di rete locale
Modificare la porta di default di ssh in Centos 6
La cosa è molto molto più complessa di quanto sembri.
Se si è bravi bisogna riuscirlo a farlo senza tagliarsi fuori dal sistema.
firewall
Per prima cosa bisogna aggiungere la nuova porta alla configurazione del firewall
In centos 6 c'è già il firewall attivo lanciare
system-config-firewall-tui
#oppure
system-config-firewall
Si apre il tool semigrafico specificare "Personalizza" — "Forward" — "<Aggiungi>" definire porta e protocollo nel nostro esempio usiamo 1234 e tcp e poi fare "Chiudi" ( se si specifica Forward invece di chiudi si può specificare anche l'interfaccia ethernet wlan dove penso la regola debba essere applicata, ma non è necessario al nostro caso). Facendo "OK" e poi "Si" le regole vengo applicate.
I risultati sono "facilmente" visibili con iptatables -L
SELinux
Su centos è anche attivo selinux che permette le connessioni per ssh solo alla porta 22. Per poter smanettare con selinux bisogna installarsi semange nel mio caso è bastato fare
yum -y install policycoreutils-python
Vediamo le impostazioni per l'ssh, come si vede c'è solo la 22
#semanage port -l | grep ssh
ssh_port_t tcp 22
Per cambiarle eseguire il seguente comando
# semanage port -a -t ssh_port_t -p tcp 1234
lui frullerà un po' e dopo quando restituirà la shell lanciando nuovamente il comando sopra si otterrà
#semanage port -l | grep ssh
ssh_port_t tcp 22,1234
Servizio ssh
Editare /etc/ssh/sshd_config e cambiare l'attributo Port
Port 1234
Dopo ricaricare il servizio ssh si può fare anche un controllo con netstat
# /sbin/service sshd reload
# netstat -tulpn | grep 1234
Modificare la porta in Ubuntu Server
Basta cambiare l'attributo port in /etc/ssh/sshd_config come scritto sopra.
Poniamo il caso meno semplice, cioè firewall sulla stessa macchina in cui ci colleghiamo in ssh.
Conviene seguire questa procedura:
- collegarsi in ssh usando la porta permessa
- aggiungere una regola al firewall con la nuova porta
- modificare la porta di ssh e lanciare sshd reload. In questo momento possiamo collegarci con la nuova porta ma abbiamo ancora la shell aperta sulla porta precedente che non viene chiusa. Così se abbiamo sbagliato qualcosa possiamo ancora salvarci.
- apriamo una nuova shell sul nostro client remoto e lanciamo una sessione ssh con la nuova porta.
- se tutto funziona possiamo eliminare la regola precedente senza problemi.
Abilitare X11 su un server centos senza interfaccia grafica
installare i seguenti pacchetti
yum install xorg-x11-xauth.x86_64
yum install xorg-x11-fonts-100dpi.noarch xorg-x11-fonts-75dpi.noarch xorg-x11-fonts-ISO8859-1-100dpi.noarch xorg-x11-fonts-ISO8859-1-75dpi.noarch xorg-x11-fonts-ISO8859-14-100dpi.noarch xorg-x11-fonts-ISO8859-14-75dpi.noarch xorg-x11-fonts-ISO8859-15-100dpi.noarch xorg-x11-fonts-ISO8859-15-75dpi.noarch xorg-x11-fonts-ISO8859-2-100dpi.noarch xorg-x11-fonts-ISO8859-2-75dpi.noarch xorg-x11-fonts-ISO8859-9-100dpi.noarch xorg-x11-fonts-ISO8859-9-75dpi.noarch xorg-x11-fonts-Type1.noarch xorg-x11-fonts-cyrillic.noarch xorg-x11-fonts-ethiopic.noarch xorg-x11-fonts-misc.noarch
yum install xorg-x11-utils.x86_64
Abilitare in sshd_config file
X11Forwarding yes
di solito già abilitato
e poi ssh -X
Slow login
È un problema di reverse del dns che è molto lento, per disabilitare questa operazione ho letto diverse pagine web e provato varie soluzioni lato server.
Alla fine lato client ho modificato
/etc/ssh/ssh_config
GSSAPIAuthentication no
invece di yes e così va tutto.
Si può fare anche nel config della propria home ma così vale per tutti.
Alcune guide interessanti per questa funzionalità http://superuser.com/questions/359344/ssh-is-slow-to-make-a-connection
http://blog.maurizio.proietti.name/2008/08/29/linux-slow-ssh-login-login-lento-con-ssh/
Execute remote command with ssh
Can be useful to upgrade a server with a script
first of all can be a good idea create a passwordless channel to automatize the script
# from my machine
ssh-keygen
ssh-copy-id root@remotesite
this is an example script that update the postfix config file
scp main.cf root@remotesite:/etc/postfix/main.cf
scp sasl_passwd.db root@remotesite:/etc/postfix/sasl_passwd.db
scp sender_canonical root@remotesite:/etc/postfix/sender_canonical
ssh root@remotesite 'echo `hostname`.remotesite > /etc/mailname'
ssh root@remotesite 'service postfix restart'
Approfondire ssh expect
http://stackoverflow.com/questions/19101879/bash-expect-script-for-ssh
Access logs
in /var/log/auth
grep sshd auth.log* | grep password
look also to the command "last" http://www.cyberciti.biz/faq/linux-unix-last-command-examples/