Difference between revisions of "Linux: SSH"

From RHS Wiki
Jump to navigation Jump to search
Line 80: Line 80:
 
== Config files ==
 
== Config files ==
 
sudo nano /etc/ssh/sshd_config  (ssh daemon config)<br />
 
sudo nano /etc/ssh/sshd_config  (ssh daemon config)<br />
$HOME/.ssh/config    (connections config)
+
=== $HOME/.ssh/config ===   (connections config)
 
  <nowiki>Host fpsim-frontend
 
  <nowiki>Host fpsim-frontend
 
     IdentityFile ~/.ssh/DNC-FKY.pem
 
     IdentityFile ~/.ssh/DNC-FKY.pem
Line 89: Line 89:
 
Host 10.255.0.*
 
Host 10.255.0.*
 
     IdentityFile ~/.ssh/rt_rsa
 
     IdentityFile ~/.ssh/rt_rsa
     User xe50582</nowiki>
+
     User xe50582
 +
 
 +
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
 +
 
 +
Host 20.1.40.*
 +
    IdentityFile ~/.ssh/rt_rsa
 +
    user xe50582
 +
 
 +
Host *.rra.lan
 +
    IdentityFile ~/.ssh/rt_rsa
 +
    user xe50582
 +
</nowiki>
  
 
== LDAP ldapkeyfile ==
 
== LDAP ldapkeyfile ==

Revision as of 12:54, 27 November 2017

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 10.255.0.*
    IdentityFile ~/.ssh/rt_rsa
    User xe50582

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

Host 20.1.40.*
    IdentityFile ~/.ssh/rt_rsa
    user xe50582

Host *.rra.lan
    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