SSH

From mmmv_kos
Jump to: navigation, search

Võtmepaariga seonduv

SSH-võtmepaari genereerimine:

# Mitte eriti toetatud variant:
# ssh-keygen -t ed25519 -C "kommentaar" -f ~/.ssh/kohaliku_masina_kontekstis_unikaalse_failinimega_privaatv8ti.txt

# Lollikindlam variant:
ssh-keygen -t rsa -C "kommentaar" -f ~/.ssh/kohaliku_masina_kontekstis_unikaalse_failinimega_privaatv8ti.txt

ssh-keygen -f ~/.ssh/kohaliku_masina_kontekstis_unikaalse_failinimega_privaatv8ti.txt -y > ~/.ssh/kohaliku_masina_kontekstis_unikaalse_failinimega_avalik_v8ti.pub


Kataloogis ~/.ssh asub fail config, mis loetleb kataloogis ~/.ssh asuvaid ssh-võtmepaaride privaatvõtmefaile ning mis loetakse ssh-klientprogrammi poolt enne /etc/ssh/ssh_config faili lugemist.

Host martin_vahi_githubi_konto
    IdentityFile ~/.ssh/id_rsa_github_b_martinvahi
    IdentitiesOnly yes # Kui seda ei ole, pakutakse serverile suvalisi
                       # võtmeid ja siis pärast "piisava" koguse 
                       # põruvate võtmete saamist viskab 
                       # server "toru hargile", katkestab ühenduse.

    HostName github.com
    Port 22
    User git

    # The interval between keep-alive-packets
    # that the client sends to the server to 
    # probe, whether the connection to the server
    # exists. The unit is seconds and 
    # single-line comments are may not appear
    # at the same line with the parameter assignment,
    # id est " # seconds" must not appear 
    # at the end of the next line.
    ServerAliveInterval 29 
 
    # Number of keep-alive-packets that are allowed to 
    # be without an answer before the connection is 
    # shut down.
    ServerAliveCountMax 10   

Host kalatestimine_githubi_konto
    IdentityFile ~/.ssh/id_rsa_github_kalatestimine
    IdentitiesOnly yes
    HostName github.com
    Port 22
    User git
    ServerAliveInterval 29
    ServerAliveCountMax 10


Paroolivabaks sisselogimiseks tuleb masinas, kuhu tahetakse sisse logida, faili

~/.ssh/authorized_keys

kopeerida ssh-võtmepaari avalik võti. Väidetavalt saab seda teha ka käsuga ssh-copy-id. Võtmega sisselogimise eelduseks on, et kataloog ~/.ssh koos selle sisuga oleks õigustes 07<eelistatavalt 0><eelistatavalt 0>. Juhul kui ~/.ssh on link, siis peab kogu rada tegeliku authorized_keys failini sellistes õigustes olema.


Operatsioonisüsteemi Globaalne seadistus


Väidetavalt kasutatakse selleks faili /etc/ssh/sshd_config. Näide

Port 22
KeepAlive yes
X11Forwarding no
TCPKeepAlive yes
#AcceptEnv LANG LC_*

ServerKeyBits 4096
KeyRegenerationInterval 7200

# aeg, mil autentimine peab p2rast yhenduse v8tmist 8nnestuma
LoginGraceTime 180 

PermitRootLogin no # yes
StrictModes yes

Protocol 2

GatewayPorts yes

PasswordAuthentication yes # no
AllowUsers ts2 kiirtigu root@192.168.42.69


# Server side version of the ServerAliveInterval
ClientAliveInterval 37 

# Server side version of the ServerAliveCountMax
ClientAliveCountMax 10


Konfifaili seaded võetakse kasutusele ssh-deemoni taaskäivitusel:

/etc/init.d/ssh restart  # juurkasutajana

# openSUSE korral tuleb ssh-server taaskäivitada käsuga:
rcsshd restart

# DragonflyBSD korral:
service sshd restart
# või, kui ei soovi taaskävitada, siis
service sshd reload

Torud/Tunnelid

Ühest LAN'ist teise, läbi ruuterite, läbi avaliku vaheserveri, on SSH-torud seoses torude katkemise ning muidu lolli realisatsiooniga väga ebatöökindlad ja nende kasutamine sellises olukorras on totaalne aja-raiskamine.


File:Ssh tunnel t1.bash

#!/usr/bin/env bash
#==========================================================================
# Initial author of this script: Martin.Vahi@softf1.com
# This script is in public domain.
#==========================================================================
# The ssh-tunnel parameters:


SSH_SERVER_IP_ADDRESS_FROM_SSH_CLIENT_PERSPECTIVE="96.163.22.231"
SSH_SERVER_PORT_FROM_SSH_CLIENT_PERSPECTIVE="22"
USERNAME_FOR_LOGGING_INTO_THE_SSH_SERVER="pi"



# The model is that each tunnel has only 2 ends and
# queries/"questions" enter the tunnel from one of the ends and
# query results, "answers", exit from the same end of the tunnel,
# where the queries entered the tunnel.
SB_QUERIES_ENTER_THE_TUNNEL_FROM_SSH_CLIENT_SIDE="t" # {t,f}, "t" for "true"



TUNNEL_IP_ADDRESS_FROM_SSH_SERVER_PERSPECTIVE="localhost"
TUNNEL_PORT_FROM_SSH_SERVER_PERSPECTIVE="30120"
 
TUNNEL_IP_ADDRESS_FROM_SSH_CLIENT_PERSPECTIVE="localhost"
TUNNEL_PORT_FROM_SSH_CLIENT_PERSPECTIVE="4146"


#-------------------------------------------------------------------------- 
# Everything below this line consists of only the implementation.
#-------------------------------------------------------------------------- 



if [ "$SB_QUERIES_ENTER_THE_TUNNEL_FROM_SSH_CLIENT_SIDE" == "t" ];then
    S_QUIRK_1="-L" # queries/questions enter the tunnel at ssh client side
else
    if [ "$SB_QUERIES_ENTER_THE_TUNNEL_FROM_SSH_CLIENT_SIDE" == "f" ];then
        S_QUIRK_1="-R" # queries/questions enter the tunnel at ssh server side
    else
        echo ""
        echo "The configuration is flawed. The "
        echo ""
        echo "    SB_QUERIES_ENTER_THE_TUNNEL_FROM_SSH_CLIENT_SIDE==$SB_QUERIES_ENTER_THE_TUNNEL_FROM_SSH_CLIENT_SIDE"
        echo ""
        echo "Supported values: {t,f}."
        echo "The model is that each tunnel has only 2 ends and "
        echo "queries enter the tunnel from one of the ends and "
        echo "query results exit from the same end of the tunnel,"
        echo "where the queries entered the tunnel."
        echo ""
        echo "GUID='91479cc3-6759-46e4-8b41-3332b09190e7'"
        echo ""
        #--------
        exit 1
    fi
fi
 
 
 
if [ "$S_QUIRK_1" == "-L" ];then
ssh -p $SSH_SERVER_PORT_FROM_SSH_CLIENT_PERSPECTIVE  $S_QUIRK_1 \
$TUNNEL_IP_ADDRESS_FROM_SSH_CLIENT_PERSPECTIVE:$TUNNEL_PORT_FROM_SSH_CLIENT_PERSPECTIVE:\
$TUNNEL_IP_ADDRESS_FROM_SSH_SERVER_PERSPECTIVE:$TUNNEL_PORT_FROM_SSH_SERVER_PERSPECTIVE \
$USERNAME_FOR_LOGGING_INTO_THE_SSH_SERVER@$SSH_SERVER_IP_ADDRESS_FROM_SSH_CLIENT_PERSPECTIVE
else
    if [ "$S_QUIRK_1" == "-R" ];then
ssh -p $SSH_SERVER_PORT_FROM_SSH_CLIENT_PERSPECTIVE  $S_QUIRK_1 \
$TUNNEL_IP_ADDRESS_FROM_SSH_SERVER_PERSPECTIVE:$TUNNEL_PORT_FROM_SSH_SERVER_PERSPECTIVE:\
$TUNNEL_IP_ADDRESS_FROM_SSH_CLIENT_PERSPECTIVE:$TUNNEL_PORT_FROM_SSH_CLIENT_PERSPECTIVE \
$USERNAME_FOR_LOGGING_INTO_THE_SSH_SERVER@$SSH_SERVER_IP_ADDRESS_FROM_SSH_CLIENT_PERSPECTIVE
    else
        echo ""
        echo "This script is flawed."
        echo "    S_QUIRK_1==$S_QUIRK_1"
        echo "GUID='52728273-65eb-4efe-b841-3332b09190e7'"
        echo ""
        #--------
        exit 1
    fi
fi


#==========================================================================


Virtuaalmasinas jooksva veebiserveri tunneldamine LAN'is olevasse füüsilisse masinasse

    # A tunnel from the virtual appliance to the 
    # remote, physical, machine, which in this
    # case is a Raspberry Pi: 

    S_RASPBERRY_PI_IP_ADDRESS="192.168.0.110"   # update to Your LAN
    S_RASPBERRY_PI_SSH_PORT="22"                # update to Your LAN
    S_RASPBERRY_PI_USERNAME="pi"                # update to Your LAN
    S_GIGABLAST_HOST_NAME_AT_VIRTUAL_APPLIANCE="localhost"    # default value
    S_GIGABLAST_PORT_AT_VIRTUAL_APPLIANCE="8000"              # default value
    S_GIGABLAST_PORT_AT_RASPBERRY_PI_LOCALHOST="7000"         # change at will

    S_PART_1=" -p $S_RASPBERRY_PI_SSH_PORT "

    S_PART_2a=" -R $S_GIGABLAST_PORT_AT_RASPBERRY_PI_LOCALHOST:"
    S_PART_2b="$S_GIGABLAST_HOST_NAME_AT_VIRTUAL_APPLIANCE:"
    S_PART_2c="$S_GIGABLAST_PORT_AT_VIRTUAL_APPLIANCE "
    S_PART_2_all="$S_PART_2a$S_PART_2b$S_PART_2c" 

    S_PART_3=" $S_RASPBERRY_PI_USERNAME@$S_RASPBERRY_PI_IP_ADDRESS "

    ssh $S_PART_1 $S_PART_2_all $S_PART_3

    # A tunnel within the Raspberry Pi, 
    # from the Raspberry Pi localhost 
    # to the Raspberry Pi public IP address:

    S_GIGABLAST_PORT_AT_RASPBERRY_PI_PUBLIC_IP_ADDRESS="8095" # change at will

    S_PART_X1a=" -L $S_RASPBERRY_PI_IP_ADDRESS:"
    S_PART_X1b="$S_GIGABLAST_PORT_AT_RASPBERRY_PI_PUBLIC_IP_ADDRESS:"
    S_PART_X1c="localhost:$S_GIGABLAST_PORT_AT_RASPBERRY_PI_LOCALHOST "
    S_PART_X1_all=" $S_PART_X1a$S_PART_X1b$S_PART_X1c  "

    ssh $S_PART_X1_all $S_RASPBERRY_PI_USERNAME@localhost


Silumine

Ühenduse katkemine autentimisel

Too many authentication failures for blabla

Kui tavaline ssh-käsk annab parooli küsimise asemel rea

Received disconnect from 195.250.189.35: 2: Too many authentication failures for vhost7825ssh


siis on abiks ssh kohalike identiteetide vahemälu tühjendamine käsuga

ssh-add -D

Antud käsk jätab tegelikult ~/.ssh sisu, alles, s.t. ei kustuta sealt kataloogist midagi. Mõttekas on see käsk cron-tööks vormistada.


Alternatiivne lahendus on anda ssh-programmile lisa-parameeter

ssh -o PubkeyAuthentication=no laura@192.168.0.100

Töökindlaim lahendus on uurida, et kas kohalikus masinas, kust ssh-ühendust luua üritatakse, on ~/.ssh/config failis iga SSH-võtme kirjelduse juures rida

IdentitiesOnly yes

ning kui selle rea lisamine ka ei aita, siis aitab paroolipõhiselt autentimiselt SSH-võtmepõhisele autentimisele üleminek. SSH-võtmetele on võimalik ka parool anda, s.t. päris nii see ei käi, et kui SSH-võtmed pihta pannakse, siis ründajad sisse pääsevad.


Veel üks räpane häkk, mida viimases ahastuses proovida

See SSH on nii pagnama puruks, et mõnikord aitab vaid

cd ~/.ssh
mkdir ./v8tmete_ladu
mv ./id_* ./v8tmete_ladu/
mv ./v8tmete_ladu/id_peamine_v8ti_mida_kasutan* ./

# Seejärel kõik ülejäänud võtmetega seonduvad 
# seadistus-blokid ~/.ssh/config failis vim'i abil välja kommenteerida.

Masendav, aga tõsi. No on "kvaliteet".


Rakendusi

Fish on FTP-analoog, mis toimib üle SSH. Konqueror'iga toimiva Fish'i URL'i näide:

fish://kasutajanimi@198.168.42.42:22/home/kasutajanimi


Mosh pidavat olema "mobiilne terminal" ("mobile shell"), mis pidavat mobiilse internetiühenduse tõttu katkenud ssh-ühendusi automaatselt taasavama.


sshfs võimaldab üle ssh-ühenduse masinaid failisüsteemi kataloogi monteerida.


Muid toruehitus-programme


ncat ja nc

kodulehekülg

# üldskeem:
# -l tähistab kuulamist
# -k tähistab kuulamise jätkamist pärast ühe vastuse saamist

ncat -lk kuulatav_IP_aadress kuulatav_port < fail_v8i_mkfifo_abil_loodu_mis_tagastatakse_kuulamisel_saadud_andmete_vastuseks   > ./kuulamisel_sisse_tulnud_andmed.blob

ncat sihtkoha_IP_aadress sihtkoha_port < ./fail_andmetega_mis_saadetakse_sihtkohta.blob

Toimivad mõlemad, nii nc kui ncat.


Unison

unison -servercmd <serveri poolel oleva unison binaari rada> ./suur.blob ssh://kasutajanimi@IPaadress_või_URL/kodukataloogi_alamkataloog/suur.blob