Linux: SSH
SSH stands for Secure Shell. Establishes a secure communication between 2 computers.
Create a key pair
To create a key pair for the ssh:
ssh-keygen -t rsa -C "your_email@example.com"
To convert the key pair to PEM format:
ssh-keygen -e -f id_rsa.pub > yourfilename.pub
-i is the inverse of the -e switch
Change SSH key Password
ssh-keygen -f id_rsa -p
Add the key to the ssh-agent
eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_rsa
View key information
ssh-keygen -l -f id_rsa.pub
Returns something like: 2048 3f:4b:dd:ce:2b:cd:dc:99:13:ff:38:4a:24:95:d4:e9 rafahsolis@gmail.com (RSA)
Copy key to server
ssh-copy-id -i path/to/key_name.pub user_name@host_name
If .pub is already uploaded to the server:
cat filename.pub >> $HOME/.ssh/authorized_keys
If home directory is encrypted
$ /sbin/umount.ecryptfs_private $ cd $HOME $ chmod 700 . $ mkdir -m 700 .ssh $ chmod 500 . $ echo $YOUR_REAL_PUBLIC_KEY > .ssh/authorized_keys $ /sbin/mount.ecryptfs_private
or change in /etc/ssh/sshd_config the line:
AuthorizedKeysFile /etc/ssh/%u/authorized_keys
ssh tunneling
This is used for example to connect to a database on a server that has the database port closed but ssh port open.
ssh -N -L localport:remotehost:remoteport remoteuser@remotehost ssh ip_maq_intermedia -L puerto_local_kali:ip_destino_real:puerto_remoto
Example:
ssh -i .ssh/MySshKey.pem -N -L 8888:localhost:3306 ubuntu@myserver.com
This will tunnel local port 8888 to the remote port 3306 (MySQL port) So you would be able to connect to
the database on myserver.com using your local port 8888.
(*) -N tells ssh that you won't execute any commands on the ssh shell.
Check/close open tunnels
netstat -n --protocol inet | grep ':22' sudo lsof -i -n | egrep '\<ssh\>' sudo lsof -i -n | egrep '\<sshd\>'
To close open tunnels
kill using the pattern:
kill pkill -f my_ssh_key.pem
To see what it will kill
ps aux | grep my_ssh_key.pem
Examples
- Access to a remote MySQL binded to 127.0.0.1 (it woudn't be accesible from outside)
Runing this command on your box:
ssh -N -L 3666:localhost:3306 user@some.remotehost.com
Makes the MySQL Server accesible at your local machine at port 3666
Configuration
Edit the following files to configure ssh
(Message of the Day)
- /etc/motd (old)
- /etc/update-motd.d/* (new)
echo -e "\e[31m\\u2588\u2588\u2588\u2588\u2588\u2588\u2588\e[33m\\n\u2588\u2588\u2588\u2588\u2588\u2588\u2588\n\e[31m\\u2588\u2588\u2588\u2588\u2588\u2588\u2588\e[37m" > /etc/update-motd.d/flag echo "cat /etc/update-motd.d/flag" >> /etc/update-motd.d/00-header
Other settings:
- /etc/ssh/sshd_config
Recomended: Disable password login:
ChallengeResponseAuthentication no PasswordAuthentication no UsePAM no
sudo service ssh restart
Videos
SSH Tutorial Basic server administration with SSH (mp4)
SSH SCP and key pairs tutorial Secure authentication and encrypted comunication (mp4)
Config files
sudo nano /etc/ssh/sshd_config (ssh daemon config)
$HOME/.ssh/config
(connections config)
Host fpsim-frontend
IdentityFile ~/.ssh/DNC-FKY.pem
Host *
ServerAliveInterval 30
ServerAliveCountMax 2
Host mi6.rra.lan
IdentityFile ~/.ssh/rra_fake.pem
User rra
Host leaks.rra.lan
IdentityFile ~/.ssh/rt_rsa
User xe50582
Host news.menupayapp.com
IdentityFile ~/.ssh/rra_id.pem
User ubuntu
Host 20.1.40.109
IdentityFile ~/.ssh/rt_rsa
User rra
# LEAVE THIS ONES AT THE BOTTOM (WILDCHARS) First match will be used
Host 20.1.40.*
IdentityFile ~/.ssh/rt_rsa
User xe50582
Host *.rra.lan
IdentityFile ~/.ssh/rt_rsa
User xe50582
Host 10.255.0.*
IdentityFile ~/.ssh/rt_rsa
User xe50582
LDAP ldapkeyfile
#!/usr/bin/env bash
ldapsearch -h rtLDAP01.igrupobbva -b dc=rtLDAP01,dc=igrupobbva -x '(&(objectClass=posixAccount)(uid='"$1"'))' 'sshPublicKey' | sed -n '/^ /{H;d};/sshPublicKey:/x;$g;s/\n *//g;s/sshPublicKey: //gp'
#sudo ldapsearch -x '(objectClass=*)' -h 192.168.56.103
#-b ou=users,dc=rtLDAP01,dc=igrupobbva
sshd_config LDAP ldapsearch
AuthorizedKeysCommand /bin/ldapkeyfile AuthorizedKeysCommandUser nobody
Welcome message
Two files must be edited:
/etc/motd (message of the day)
/etc/ssh/sshd_config: Change the setting PrintLastLog to "no", this will disable the "Last login" message.
Convert rsa to ppk
puttygen keyname -o keyname.ppk
Avoid broken pipe
2 options:
ClientAliveInterval, SeverAliveInterval
Client side
Use ClientAliveInterval if you have a jump machine
create file: /home/user/.ssh/config with the following content: (client side) chmod 600
Host *
ServerAliveInterval 60
ServerAliveCountMax 2
For each user, or ading to /etc/ssh/ssh_config
ServerAliveInterval 60 ClientAliveCountMax 2
Server side
echo "ClientAliveInterval 60" | sudo tee -a /etc/ssh/sshd_config
2:
echo 60 > /proc/sys/net/ipv4/tcp_keepalive_time
Shell script to reconnect on broken pipe:
#!/bin/sh
#This is an SSH-D proxy with auto-reconnect on disconnect
#Created by Liang Sun on 28, Sep, 2011
#Email: i@liangsun.org
i=0
while test 1==1
do
remote_ip=YOUR_REMOTE_IP
remote_user=YOUR_REMOTE_USER
local_port=YOUR_LOCAL_PORT
exist=`ps aux | grep $remote_user@$remote_ip | grep $local_port`
#echo $exist
if test -n "$exist"
then
if test $i -eq 0
then
echo "I'm alive since $(date)"
fi
i=1
else
i=0
echo "I died... God is bringing me back..."
ssh $remote_user@$remote_ip -f -N -D 0.0.0.0:$local_port
fi
sleep 1
done
known_hosts
Remove offending key
If when trying to connect to a host you get the message:
Offending ECDSA key in /home/user/.ssh/known_hosts:#:
and you trust the host (this can happen when you change CNAME file of your DNS to point to a different server
ssh-keygen -f "/home/user/.ssh/known_hosts" -R server_dns_or_ip
Enable ssh at boot
update-rc.d -f ssh enable 2 3 4 5
Force password authentication
ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no example.com