Secure shell je dvojice programů, sshd secure shell daemon, který běží na vzdáleném stroji a poslouchá na TCP portu 22, ssh je klientský program, který ovládáme my na našem počítači.
Konfigurace openssh serveru
Konfigurace openssh serveru je standardně v souboru /etc/ssh/sshd_config
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# $OpenBSD: sshd_config,v 1.104 2021/07/02 05:11:21 dtucker Exp $
# This is the sshd server system-wide configuration file. See
# sshd_config(5) for more information.
# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented. Uncommented options override the
# default value.
Port 22 (1)
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
#HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_ecdsa_key
#HostKey /etc/ssh/ssh_host_ed25519_key
# Ciphers and keying
#RekeyLimit default none
# Logging
#SyslogFacility AUTH
#LogLevel INFO
# Authentication:
#LoginGraceTime 2m
PermitRootLogin prohibit-password (2)
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
#PubkeyAuthentication yes (3)
# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
# but this is overridden so installations will only check .ssh/authorized_keys
AuthorizedKeysFile .ssh/authorized_keys (4)
#AuthorizedPrincipalsFile none
#AuthorizedKeysCommand none
#AuthorizedKeysCommandUser nobody
# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# HostbasedAuthentication
#IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes
# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication yes (5)
#PermitEmptyPasswords no
# Change to no to disable s/key passwords
#KbdInteractiveAuthentication yes
#AllowAgentForwarding yes
#AllowTcpForwarding yes
#GatewayPorts no
#X11Forwarding no
#X11DisplayOffset 10
#X11UseLocalhost yes
#PermitTTY yes
#PrintMotd yes
#PrintLastLog yes
#TCPKeepAlive yes
#PermitUserEnvironment no
#Compression delayed
#ClientAliveInterval 0
#ClientAliveCountMax 3
#UseDNS no
#PidFile /var/run/sshd.pid
#MaxStartups 10:30:100
#PermitTunnel no
#ChrootDirectory none
#VersionAddendum none
# no default banner path
#Banner none
# override default of no subsystems
Subsystem sftp /usr/libexec/sftp-server (6)
# Example of overriding settings on a per-user basis
#Match User anoncvs
# X11Forwarding no
# AllowTcpForwarding no
# PermitTTY no
# ForceCommand cvs server
| 1 | TCP port, na kterém poslouchá SSH (implicitně 22). |
| 2 | root se může přihlašovat jenom klíčem, ne heslem |
| 3 | přihlášení klíčem je povoleno |
| 4 | kde jsou uloženy veřejné klíče pro přihlášení uživatele |
| 5 | přihlášení heslem je povoleno |
| 6 | používá se sftp |
Obvykle není potřeba v konfiguraci serveru nic měnit, pouze se z bezpečnostních důvodů zakazuje přihlášení roota heslem. Je to volba PermitRootLogin prohibit-password. Pokud je PermitRootLogin yes, tak se root může přihlásit heslem, pokud je PermitRootLogin no, tak se root vůbec nemůže přihlásit pomocí ssh.
Podrobný popis všech voleb konfiguračního souboru lze najít v manuálu (man sshd_config) nebo na stránce https://man.openbsd.org/sshd_config.
Ukázka z manuálu (1 stránka):
SSHD_CONFIG(5) File Formats Manual SSHD_CONFIG(5)
NAME
sshd_config - OpenSSH daemon configuration file
DESCRIPTION
sshd(8) reads configuration data from /etc/ssh/sshd_config (or the file
specified with -f on the command line). The file contains keyword-
argument pairs, one per line. Unless noted otherwise, for each keyword,
the first obtained value will be used. Lines starting with `#' and empty
lines are interpreted as comments. Arguments may optionally be enclosed
in double quotes (") in order to represent arguments containing spaces.
The possible keywords and their meanings are as follows (note that
keywords are case-insensitive and arguments are case-sensitive):
AcceptEnv
Specifies what environment variables sent by the client will be
copied into the session's environ(7). See SendEnv and SetEnv in
ssh_config(5) for how to configure the client. The TERM
environment variable is always accepted whenever the client
requests a pseudo-terminal as it is required by the protocol.
Variables are specified by name, which may contain the wildcard
characters `*' and `?'. Multiple environment variables may be
separated by whitespace or spread across multiple AcceptEnv
directives. Be warned that some environment variables could be
used to bypass restricted user environments. For this reason,
care should be taken in the use of this directive. The default
is not to accept any environment variables.
AddressFamily
Specifies which address family should be used by sshd(8). Valid
arguments are any (the default), inet (use IPv4 only), or inet6
(use IPv6 only).
AllowAgentForwarding
Specifies whether ssh-agent(1) forwarding is permitted. The
default is yes. Note that disabling agent forwarding does not
improve security unless users are also denied shell access, as
they can always install their own forwarders.
AllowGroups
This keyword can be followed by a list of group name patterns,
separated by spaces. If specified, login is allowed only for
users whose primary group or supplementary group list matches one
of the patterns. Only group names are valid; a numerical group
ID is not recognized. By default, login is allowed for all
groups. The allow/deny groups directives are processed in the
following order: DenyGroups, AllowGroups.
See PATTERNS in ssh_config(5) for more information on patterns.
This keyword may appear multiple times in sshd_config with each
instance appending to the list.
AllowStreamLocalForwarding
Specifies whether StreamLocal (Unix-domain socket) forwarding is
permitted. The available options are yes (the default) or all to
allow StreamLocal forwarding, no to prevent all StreamLocal
forwarding, local to allow local (from the perspective of ssh(1))
forwarding only or remote to allow remote forwarding only. Note
that disabling StreamLocal forwarding does not improve security
unless users are also denied shell access, as they can always
install their own forwarders.
AllowTcpForwarding
Specifies whether TCP forwarding is permitted. The available
options are yes (the default) or all to allow TCP forwarding, no
to prevent all TCP forwarding, local to allow local (from the
perspective of ssh(1)) forwarding only or remote to allow remote
forwarding only. Note that disabling TCP forwarding does not
improve security unless users are also denied shell access, as
they can always install their own forwarders.
AllowUsers
This keyword can be followed by a list of user name patterns,
:(1)
| 1 | V manuálu se lze pohybovat pomocí kláves Page Down, Page Up, Home a End, manuál opustíme klávesou q. |
Instalace uživatele na serveru (vzdáleném stroji)
Administrátor vzdáleného stroje (root) musí vytvořit uživatele, třeba takto:
mujbsd# adduser (1)
Use option ``-silent'' if you don't want to see all warnings and questions.
Reading /etc/shells
Check /etc/master.passwd
Check /etc/group
Ok, let's go.
Don't worry about mistakes. There will be a chance later to correct any input.
Enter username []: jirka.chraska (2)
Enter full name []: Jirka Chraska (3)
Enter shell bash csh ksh nologin sh [ksh]: (4)
Uid [1004]: (5)
Login group jirka.chraska [jirka.chraska]: (6)
Login group is ``jirka.chraska''. Invite jirka.chraska into other groups: guest no
[no]: (7)
Login class authpf bgpd daemon default pbuild staff unbound vmd xenodm
[default]: (8)
Enter password []: (9)
Enter password again []: (10)
Name: jirka.chraska
Password: ****
Fullname: Jirka Chraska
Uid: 1004
Gid: 1004 (jirka.chraska)
Groups: jirka.chraska
Login Class: default
HOME: /home/jirka.chraska
Shell: /bin/ksh
OK? (y/n) [y]: y (11)
Added user ``jirka.chraska''
Copy files from /etc/skel to /home/jirka.chraska
Add another user? (y/n) [y]: n (12)
Goodbye!
mujbsd#
| 1 | Příkaz systému k přidání uživatele adduser. |
| 2 | Zadání uživatelského jména (bez háčků a čárek), uživatelské jméno musí být unikátní na daném stroji. |
| 3 | Skutečné jméno uživatele, nepovinná část. |
| 4 | Jaký shell bude uživatel používat. |
| 5 | UID je user ID, číselná identifikace uživatele v systému. |
| 6 | Přihlašovací skupina uživatele. |
| 7 | Další skupiny, jejichž je uživatel členem. |
| 8 | Typ uživatele |
| 9 | Zadání uživatelova hesla, na konzoli se nic nevypisuje. |
| 10 | Zopakování uživatelova hesla, opět se na terminál nic nevypisuje. |
| 11 | Rekapitulace toho, co jsme udělali. Máme to jak chceme, napíšeme y ano. |
| 12 | Chcete dělat dalšího uživatele. Ne. |
Uživatele má administrátor vytvořen, řekne uživateli jeho heslo a nyní se uživatel jirka.chraska může přihlásit na vzdálený stroj (IP 10.1.1.97), prokazovat se bude heslem.
jirka@jirka-Precision-T3610:~$ ssh jirka.chraska@10.1.1.197 (1)
jirka.chraska@10.1.1.197's password: (2)
OpenBSD 7.3 (GENERIC.MP) #1125: Sat Mar 25 10:36:29 MDT 2023 (3)
Welcome to OpenBSD: The proactively secure Unix-like operating system.
Please use the sendbug(1) utility to report bugs in the system.
Before reporting a bug, please try to reproduce it with the latest
version of the code. With bug reports, please try to ensure that
enough information to reproduce the problem is enclosed, and if a
known fix for it exists, include that as well.
mujbsd$ passwd (4)
Changing password for jirka.chraska.
Old password: (5)
New password: (6)
Retype new password: (7)
passwd: password updated successfully
mujbsd$ ^D (8)
Connection to 10.1.1.197 closed.
jirka@jirka-Precision-T3610:~$ (9)
| 1 | Uživatel spustí ssh klienta a předá mu parametry připojení uživatel@stroj. |
| 2 | Výzva k zadání hesla, nic se na terminál nevypisuje. |
| 3 | Uvítací obrazovka vzdáleného systému. |
| 4 | Uživatel jirka.chraska si chce změnit heslo. |
| 5 | Musí zadat staré heslo (co mu řekl administrátor). Při zadávání hesla se nic na terminál nevypisuje. |
| 6 | Zadání nového hesla. |
| 7 | Ještě jednou nové heslo pro kontrolu. |
| 8 | Ctrl+D slouží k ukončení spojení. Je možné také napsat exit. |
| 9 | A jsme zase doma, na svém počítači. |
Přihlašování heslem je otravná záležitost, při každém požadavku na připojení pomocí ssh se musí zadávat heslo.
Proto je lepší si vygenerovat pár ssh klíčů (veřejný a privátní), veřejný klíč poslat administrátorovi (klidně emailem) a vesele se přihlašovat bez hesla. Administrátor přidá veřejný klíč uživatele do jeho souboru ~/.ssh/authorized_keys a už to funguje. V souboru ~/.ssh/authorized_keys může být veřejných klíčů mnoho a všichni, kdo ho tam mají se mohou přihlásit.
Nebo si může veřejný klíč přidat do ~/.ssh/authorized_keys uživatel sám.
Znak vlnovka ~ je standardní zkratka pro domácí adresář uživatele. Domácí adresář pro uživatele jirka.chraska je /home/jirka.chraska
Nejdříve vygenerujeme pár klíčů.
Generování páru klíčů
Ke generování páru klíčů souží příkaz ssh-keygen, jeho manuálová stránka (podrobná dokumentace) je zde, na Linuxu či OpenBSD man ssh-keygen.
Privátní klíče se obvykle ukládají do adresáře /home/<uzivatel>/.ssh nebo je možné si je uložit třeba na hardwarový USB klíč Yubikey nebo Nitrokey
Porovnání různých hardwarových klíčů na serveru www.howtogeek.com.
jirka@jirka-Precision-T3610:~/vyuka_sspvc$ ssh-keygen -t ed25519 (1)
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/jirka/.ssh/id_ed25519): jirka_ed25519 (2)
Enter passphrase (empty for no passphrase): (3)
Enter same passphrase again: (4)
Your identification has been saved in jirka_ed25519 (5)
Your public key has been saved in jirka_ed25519.pub (6)
The key fingerprint is:
SHA256:BX33I7wVpddzVooOesO/pVsPHnJDo95ik7rsTXZDDg0 jirka@jirka-Precision-T3610 (7)
The key's randomart image is: (8)
+--[ED25519 256]--+
| .. +|
| .. ...+o|
| o.E.oo*|
| + o = =+|
| S + o O .|
| . o B . |
| *.@ |
| . ==@ * |
| .=+*+o .|
+----[SHA256]-----+
jirka@jirka-Precision-T3610:~/vyuka_sspvc$
| 1 | Budu generovat klíč typu ed25519 |
| 2 | Protože už mám defaultní klíč /home/jirka/.ssh/id_ed25519, uložím si klíče jinam (jirka_ed25519) |
| 3 | Zadání hesla ke klíči |
| 4 | Ještě jsenou heslo, pro kontrolu |
| 5 | Privátní klíč je uložen do souboru jirka_ed25519 |
| 6 | Veřejný klíč je uložen do souboru jirka_ed25519.pub |
| 7 | SHA256 otisk klíče |
| 8 | Obrázek |
Ed25519 kryptosystém s podpisováním a veřejným klíčem vymysleli a naprogramovala Daniel J. Bernstein https://ed25519.cr.yp.to/index.html, Niels Duif, Tanja Lange, Peter Schwabe a Bi-Yin Yang.
Ukázka implementace v Pythonu je zde.
Ed25519 kryptosystém je plně open source a není zatížen žádnými softwarovými patenty.
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIF/xsc2zgf/uqHnWSYJV3p00gT+1VKGPbRDPQpUBLOHB jirka@jirka-Precision-T3610
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACBf8bHNs4H/7qh51kmCVd6dNIE/tVShj20Qz0KVASzhwQAAAKAGM9wVBjPc
FQAAAAtzc2gtZWQyNTUxOQAAACBf8bHNs4H/7qh51kmCVd6dNIE/tVShj20Qz0KVASzhwQ
AAAEAnr9MoZPwKAsY0X49T4iMK0uNiBb8Ar44P+7v3GiDZ9F/xsc2zgf/uqHnWSYJV3p00
gT+1VKGPbRDPQpUBLOHBAAAAG2ppcmthQGppcmthLVByZWNpc2lvbi1UMzYxMAEC
-----END OPENSSH PRIVATE KEY-----
Tento pár klíčů nebudu samozřejmě na nic používat, protože jsem porušil hlavní bezpečnostní zásadu a zveřejnil jsem privátní klíč. Jsou tady jenom pro účel výuky.
Obdobně mohu vygenerovat klíče typu RSA:
ssh-keygen -t rsa -C jirka@lixis.cz (1)
Generating public/private rsa key pair.
Enter file in which to save the key (/home/jirka/.ssh/id_rsa): jirka_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in jirka_rsa
Your public key has been saved in jirka_rsa.pub
The key fingerprint is:
SHA256:fTm9ogckGoJAZpNsYe3aNi6ZJWB1L1ljc52nZNNGUxU jirka@lixis.cz
The key's randomart image is:
+---[RSA 3072]----+
|oB+ . +o.E+|
|=+.o . = . * +. |
|..o.. = + o = |
|.....o...... o |
|o o ..oSo. + . |
| o = . .. . . |
| B . .. . |
| + . ... |
| . .. |
+----[SHA256]-----+
| 1 | Pomocí parametru -C mohu zadat svoji emailovou adresu jirka@lixis.cz |
jirka@jirka-Precision-T3610:~/vyuka_sspvc/krypto/ssh$ cat jirka_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDcBgcZrqhT+viJyR8ZDhDrgY1TBYWfsLZfBdj9NJCxQK4nxO6zE6PNhkpclsUaE+ZJ91brLca4+IaFdjWCNeorUE7I7/i0QwnJoZtnJfbd+fE+Evc/yMwbku1W2nBO9Jq0042d4PlUK+ZeJ0o+iL386ycq9i5/Z+dlxFtojMnGlseA6coR+l+Lw0VqzuNbNDOEYiQTxDAUmamejxwOEEi8d7RVSVQ7O3CJDvfLGqycHTzm5pHCMMVRVxo9AlKfhr6gPUypDa8a7leEec+kbtVe+AKD79VxnfyxbKcrKEXzk1wO/EeRoqNDJWEvwR0kIj9OjmHDCOGV/7VK4WppZVbQeGcJw1v2g+IXKyx/OktiDvpIg43U6ShSs19G5npqpUvJ67cOlfGFPaKNTi8kg145BBERj7iLhVIo+1+uoBbUA8ZeFJwQkdhT+FOSa/F9i1fVI0TZ/dahP9TcPoc49iEF/8GyjgXwcmZ7A7kymuvTvS/CsUAkSUHcGYWVL35LBTU= jirka@lixis.cz
jirka@jirka-Precision-T3610:~/vyuka_sspvc/krypto/ssh$
jirka@jirka-Precision-T3610:~/vyuka_sspvc/krypto/ssh$ cat jirka_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
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
-----END OPENSSH PRIVATE KEY-----
jirka@jirka-Precision-T3610:~/vyuka_sspvc/krypto/ssh$
Tento pár klíčů nebudu samozřejmě na nic používat, protože jsem porušil hlavní bezpečnostní zásadu a zveřejnil jsem privátní klíč. Jsou tady jenom pro účel výuky.
RSA kryptosystém je popsán třeba na Wikipedii. Je to poměrně dlouhé povídání. Česká verze je hodně zkrácená.
Kopírování veřejného klíče na vzdálený stroj
Tady to udělá uživatel jirka sám, nebude otravovat administrátora. Použije k tomu příkaz scp (secure copy).
jirka@jirka-Precision-T3610:~$ scp /home/jirka/.ssh/id_ed25519.pub jirka@10.1.1.197:/home/jirka/muj_ssh_klic.pub (1)
jirka@10.1.1.197's password: (2)
id_ed25519.pub 100% 90 6.9KB/s 00:00
jirka@jirka-Precision-T3610:~$ (3)
| 1 | Příkaz ke zkopírování našeho veřejného klíče na vzdálený stroj. |
| 2 | Zadání hesla na vzdáleném stroji. |
| 3 | Soubor id_ed25519.pub je zkopírován do vzdáleného souboru /home/jirka/muj_ssh_klic.pub |
Přidání veřejného klíče do seznamu autorizovaných klíčů
jirka@jirka-Precision-T3610:~$ ssh 10.1.1.197 (1)
jirka@10.1.1.197's password: (2)
Last login: Mon Apr 17 19:11:17 2023 from 192.168.120.242
OpenBSD 7.3 (GENERIC.MP) #1125: Sat Mar 25 10:36:29 MDT 2023
Welcome to OpenBSD: The proactively secure Unix-like operating system.
Please use the sendbug(1) utility to report bugs in the system.
Before reporting a bug, please try to reproduce it with the latest
version of the code. With bug reports, please try to ensure that
enough information to reproduce the problem is enclosed, and if a
known fix for it exists, include that as well.
mujbsd$ cat muj_ssh_klic.pub >> .ssh/authorized_keys (3)
mujbsd$ (4)
| 1 | Přihlášení heslem na vzdálený stroj 10.1.1.197 |
| 2 | Zadání hesla |
| 3 | Příkaz k přidání mého veřejného klíče do seznamu autorizovaných klíčů (.ssh/autorized_keys). Znaky >> říkají shellu, přidej to na konec souboru. |
| 4 | Hotovo. |
Lepší způsob přidání našeho veřejného klíče do seznamu autorizovaných klíčů na vzdálením stroji
K tomu se používá utilita ssh-copy-id která udělá dvě věci: zkopíruje veřejný klíč na vzdálený stroj (za předpokladu, že se tam můžeme přihlásit heslem) a přidá ho do .ssh/authorized_keys.
Použití je: ssh-copy-id -i <nas_klic> <uzivatel>@<server>
jirka@jirka-Precision-T3610:~$ ssh-copy-id -i .ssh/id_ed25519 jirka.chraska@10.1.1.197 (1)
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: ".ssh/id_ed25519.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
jirka.chraska@10.1.1.197's password: (2)
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'jirka.chraska@10.1.1.197'"
and check to make sure that only the key(s) you wanted were added.
jirka@jirka-Precision-T3610:~$ ssh jirka.chraska@10.1.1.197 (3)
Last login: Tue Apr 18 01:38:41 2023 from 192.168.120.242
OpenBSD 7.3 (GENERIC.MP) #1125: Sat Mar 25 10:36:29 MDT 2023
Welcome to OpenBSD: The proactively secure Unix-like operating system.
Please use the sendbug(1) utility to report bugs in the system.
Before reporting a bug, please try to reproduce it with the latest
version of the code. With bug reports, please try to ensure that
enough information to reproduce the problem is enclosed, and if a
known fix for it exists, include that as well.
mujbsd$ (4)
| 1 | Všimněte si, že se nezadává přípona pub. Ale nefunguje to pokud se zadá jenom id_ed25519. Pokud jsem v domácím adresáři, musím zadat .ssh/id_ed25519, pokud jsem jinde musím zadat plnou cestu /home/jirka/.ssh/id_ed25519 |
| 2 | Zadání vzdáleného hesla. |
| 3 | Test přihlášení klíčem. |
| 4 | Funguje to. |
Problém s touto utilitou je v tom, že pokud soubor authorized_keys nekončí znakem <nový řádek>, tak to soubor authorized_keys zmastí a prostě připlácne náš veřejný klíč k předchozímu veřejnému klíči. Budeme pak muset stejně soubor authorized_keys ručně opravit editorem.
Přihlášení
Přihlášení klíčem
jirka@jirka-Precision-T3610:~$ ssh jirka@10.1.1.197 (1)
Last login: Mon Apr 17 19:32:41 2023 from 192.168.120.242 (2)
OpenBSD 7.3 (GENERIC.MP) #1125: Sat Mar 25 10:36:29 MDT 2023
Welcome to OpenBSD: The proactively secure Unix-like operating system.
Please use the sendbug(1) utility to report bugs in the system.
Before reporting a bug, please try to reproduce it with the latest
version of the code. With bug reports, please try to ensure that
enough information to reproduce the problem is enclosed, and if a
known fix for it exists, include that as well.
mujbsd$ exit(3)
Connection to 10.1.1.197 closed.
jirka@jirka-Precision-T3610:~$ (4)
| 1 | ssh je chytrý, pokud najde v domácím adresáři soubor s privátním klíčem id_rsa nebo id_ed25519, tak uživatele neotravuje a hned ho použije. |
| 2 | Jsme na vzdáleném stroji, toto je uvítací obrazovka. |
| 3 | Vracíme se zpátky. |
| 4 | A jsme zase doma. |
Při přihlášení klíčem jsem žádné heslo nezadával, protože jsem si vygeneroval klíč, který není zabezpečen heslem. Je zabezpečen tak, že celý disk mého počítače je šifrován a jiný uživatel než jirka na mém počítači neexistuje.
Pokud ssh nemůže náš klíč najít (třeba se jmenuje jinak nebo ho máme někde jinde než v adresáři ~/.ssh/) tak pomůžeme ssh parametrem -i a zadáme plnou cestu k privátnímu klíči.
jirka@jirka-Precision-T3610:~$ ssh -i /home/jirka/.ssh/id_ed25519 jirka.chraska@10.1.1.197
Last login: Tue Apr 18 03:47:48 2023 from 192.168.120.242
OpenBSD 7.3 (GENERIC.MP) #1125: Sat Mar 25 10:36:29 MDT 2023
Welcome to OpenBSD: The proactively secure Unix-like operating system.
Please use the sendbug(1) utility to report bugs in the system.
Before reporting a bug, please try to reproduce it with the latest
version of the code. With bug reports, please try to ensure that
enough information to reproduce the problem is enclosed, and if a
known fix for it exists, include that as well.
mujbsd$
Seznam uživatelů, kteří se mohou přihlásit na účet vzdáleného stoje je na vdáleném stroji v souboru ~/.ssh/authorized_keys
dizzy# cat .ssh/authorized_keys
ssh-rsa (1)
AAAAB3NzaC1yc2EAAAABIwAAAIEAznFtDCAckneMBtGM+2NVv2ahXWTfOL0iJcBfvalcGOYL7nZJ2Ozm7x8n4ee7VaHZUwjRUZ1iZskdXNKMrWh4JAyFlaOFXkBddsOELirmGabQaTICfHUsjIr6PM8eHfaEJK2FcwxE6CnrBhD6WuVilko1lgBv4V7/Dc8U3f3dljs= root@ernie.jaro.chorche.cz (2)
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9Q23OZuZmEkfN8VXhzMvyKNQCouFpMnQvKb03iD3Vlumebb1YQgVYXtohe7lt1YuQ1qIrxU40LX6kL1Yi2JuOW9M/eTNSSiHUIMXVTcGJVW8BkNjQlV/e4v/lF9YiPeWHtRbyy8jQVW2j4kCKKHg6Azj2cq8CyxaxXFEqBaQuLfW7u0ZOrYhyG4fTjDHliblfz/AZdhC5l1gr+3RI4ZMYXIq9eAywWVBuihzvvAdpDMp988LjfzeMTwb2BAMGXEHZUtJshVW4RfmMGHTwXQlwLhtKE0kOGJthYB8iRRx8tX71mAYHDqebvqAD5vEipRYjPAttmepOakjFszQR7tqh root@fw.semonice.cz
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDrYeoTY5LQNm4gsVT10rbEEfnhKLQ1WR+WPbXkXPEhNmCfOwfkYz9aBpQuDMjCrqku6yWfHVFfQy6xoWuuvUlyVoBflrblRZjSMk31UQfOwKCc0JhMpLRYXM/fnsHiGRBj2+ILdNCwsRnhvCGGZlRvYyjgwfPn3LIHOG6J6vq6phsmX/ChTVTEwELQN5fYg5Oo6jQhbDYWsZb6nvUpNyuiBJJI80Zs/fWx36Z9FWAAZkBhUH13cV603AV9aw5uJFU5Ty/KXYy9giTOFKw0iQtT0mq5xAKBOaddK247AwPRgwTKmsEKaZVx+W7sNdf4hRHEApOYB+dJRWplszT+9a3P root@fw.pretis.cz
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDIxpe1NzkwPeHH6bcSMYKoBkBNgQoT45ApA6LYNkeLWsDeUWw8hz0OaDoG2LwXp2CEB541WeqgE2tRdlf2xUowVr/YgV/FKLYQcApCe7g5USRXDxPFdD1M42lS7p2Qd5E4jgXylWaUkFNVFdriYgazjV1zNpBjgGSeinBAsmH4eGd1O7CJ3mKBPXtn4+W4mQc9Lp9kK+a0UEzTwRnYA0qGi6uasnAdhrF7xLopxgekRLT0JsCR9+7XKhQIUXgSLyTsWWRkOHNMu0RKlXdRCLiljMwb61+W2E/lMLTAoQ+8/V4WqJ0ZRnbRZAOZQgozLv94rsoPm9Tyknl+maY577Nv0lsg9CdVJxDu5VN0VUxVTp4Rr9FjnuiNEk+ezMALslIhHknAaqMllJ5cNtwP8WYaLLe+1OLu0b1ZcXImWtqBJd00dYVeeozqD3+31x5sfKbPylrKx+75FjTGtD8ybwsRkAcw/vdy/ZuZ/JgOviYZMS7Vo5Jgnenub/raK0tu0HU= root@mfw.billcom.cz
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDNExGjpog0J1uLQEhXCMiiU9yONGtxHbxc4OUVOGTajKMMo+S6OZ1MLZnFhmJo6Q1ac4Q55rPIsaR0ISpGATYRRpCOdZ8TlSDgV41jqUHXLWNFochdwUD74ZjMKmkg+P0+zW1/JsdVBC/o7rhrFkT0mwrh3CoGVpSc0HR2iZhOo+sM+O+lqmkf+CAyLSd2puMxkuNyxz/sGDeA/stHfbO6/t4S0oakm9abpUNlJ1FRUoonIDGD2VkkOddiXOkvZET30zAKVtf2DkD/xYhkuruLN9nIp67OCwdD70snitYlobO1cLsja/vrE4GhlcM+OFsotxn3pykJ8zeeq5qo2imp root@zsbn
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/unvuseaFTmOH8DI3OJuzjDPwazmYP1LKDCDoRart+eD4z5BIveZ+945hGAPrrJPTn0oTZQ25K2HMaQoz+UTjswOiSmxsQRMXz5UxjesKFWS1wL1PwzWrHQ/jCLDtncVGgBUoMQhV0QMFZdxoitEAW8BPvQ4UT5/62S/+XOFlRPJSFdirgl8dpvMFdPGX6YwynDcCMM3wgGZy6ZtDNua0ff4XL7eKwVDQPJXqPUBKes2Kfm20G4cGxK9wsYJ9V7ab05CPCtb4WxEjUzQN0tONPU3qQgfTQu9cXGYkr8hAufO6RvLxSwfnM7Vpn31Wih9HHcroS+7GkLQ4USifOD3h jirka@s2
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBztubAH2FxFeqPUt+isrsbxOdJmuMBowf3fEYAAB4Tn jirka@c1
dizzy#
| 1 | Typ klíče, ssh-rsa nebo ssh-ed25519 |
| 2 | Uživatel, co se může přihlásti tímto klíčem. Až sem je to jeden řádek, na webu se to rozbije na více řádků. |
První přihlášení uživatele na vzdálený stroj
Při prvním přihlášení se ověřuje a potvrzuje důvěryhodnost vzdáleného stroje. V našem případě je autentizace heslem.
jirka@jirka-Precision-T3610:~$ ssh 10.1.1.197 (1)
The authenticity of host '10.1.1.197 (10.1.1.197)' can't be established.
ECDSA key fingerprint is SHA256:yMtU7USnIIMvQyNzeRf6Wg7yT+Me1ztnoQM1FnnEBHs.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes (2)
Warning: Permanently added '10.1.1.197' (ECDSA) to the list of known hosts.
jirka@10.1.1.197's password: (3)
Last login: Tue Apr 11 12:10:43 2023 from 192.168.120.237
OpenBSD 7.3 (GENERIC.MP) #1125: Sat Mar 25 10:36:29 MDT 2023
Welcome to OpenBSD: The proactively secure Unix-like operating system.
Please use the sendbug(1) utility to report bugs in the system.
Before reporting a bug, please try to reproduce it with the latest
version of the code. With bug reports, please try to ensure that
enough information to reproduce the problem is enclosed, and if a
known fix for it exists, include that as well.
mujbsd$ (4)
| 1 | Zadáme v terminálu ssh a jméno stroje nebo IP adresu vzdáleného stroje (uživatel je jirka, je stejný jako na našem stroji, proto ho nemusíme psát) |
| 2 | Při prvním přihlášení k vzdálenému stroji musíme potvrdit, že se k němu chceme přihlásit. K tomu se nám zobrazí otisk jeho veřejného klíče. Pokud souhlasíme, napíšeme yes. |
| 3 | Dostaneme výzvu k napsání našeho hesla, napíšeme naše heslo, které se při psaní nevypisuje. |
| 4 | A jsme na vzdáleném stroji mujbsd jako uživatel jirka. |
Seznam důvěryhodných serverů
Seznam ověřených a tedy pro nás důvěryhodných serverů máme na lokálním stroji v souboru /home/<uzivatel>/.ssh/known_hosts
dizzy$ cat /home/jirka/.ssh/known_hosts
192.168.120.12 (1)
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBPxdPDSKqXPoOhC0BwZSZs5tEgPcYUnlw6m5zwXayqOURc8QRcBXDPxsnxwz72SI67J/LHXn4/mwKscZXLcqz9M= (2)
192.168.120.12 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDb+qoU0RJn4+6eMTuOaGTxLU9bl+hCE8G/6BubSMwlerAmNI/NP3JqQ3rugoHu+PjnRu5PynPKK+pTm4/tqfzQMO9d4l/i6an4PVGJUbF//HI7Tw/6tJ5eXDTnf/xEBQxlKg8rpExum8kfuRfe6Wqh3fbNQ+NfrlT8iLle/vhPoz3dARFpBA325GyVb7cTat7VanaCNP1YeFygV9nwQ1hHEwWkvCdeOKRHuNuXaFbrBf35aYI/1/AKMxkyqtPRF0Xe5rNPXK9ut1sETDI08D5e7z1B3ddFJUEVf9yCoAzlTOcROZnVLBzRbbQjqema9iaRBhf3/z2C6y0WtDr2hyUx
192.168.120.12 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB8ypV/mInwMI10+QMFD1z/W6eW4m9mSTa3YsWV3+OSI
31.30.12.223 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGtGQ7bmGuaegFEl6tQ0DgR5cRwHSx/FIzuMx8Xi9Dz+
31.30.12.223 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCduWjxlStaQbdBWC+f2YtWFmOgnkN0PvsD+tKmJ+F5Jb1ZGOuWUOteKNIDKZQH0qCTrZ/YLivlr1fZSqFclOd/U5NeH3UlN5siGVLbfbTm9NM7Bmq8VygQEPU+mEEMIvnOy3+a0P0EMZADydIkqoTRqa9RRixeacNSB2sYklu9CqeiVxOzoGCk2EybO0lpt7Tblf+mGLAE7YSIVYNet+tInv34c+AtgzWdodPtJhZ76rG5k1Psp6zEWYkUmGcf1jjdWKV6chGCbkyyc8+Qlxf4/IZU3RpplvnTYn2p6O0btnM+WpEmTJgq0Z42n4V33eIWVsYH26B4daoKYBGaWP/1
31.30.12.223 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBMwK45GvbV4YX7pIUZwA7HB8Hj/qvSn5lwYv57okeUnQNBJ3kK267RTlKMdRyeUxPwb+wkOoYc0oZ3ohPLTIJIc=
192.168.120.121 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGH5mJ3pUUUc/j4vdSgdldY8e6EBirSMW4WV/lNDv0nH
192.168.120.121 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCo6nDdgp60xYJvMd6FiJGL/ALc8dG9YD54JyRELOdXd4KJxhwY5/WGNZDElL9kTYm/z4nalyzpxXcOT1mq/Mp4e/i0ckYu5qvC9TeCU2OOBei9pJsGNSyt6kgTubwoQ8RdMSGfqGZEZh7VQQAVAs42pk5uC5EqKv/gNCZgebFsyBKIX8Ruu517rZDXTw+rSG/4fi74faRvNeFEBwyPN333FjFxApy7zK9gu+MmPZqHVvI8mrZUGDQY5eCeThMzWmiIDFA2vO8FA4qkfcGkWBQVYoITOhjJycwWa/F/Um7uUbFAgMeiQdYT3pmiuOAFiIUOuO1wC/WS2ajCLt3ohY2H
192.168.120.121 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBE9QFTK5AKxneYkbc8dezztXZColIxk8mgAighECMMhArCekaiLTSBFg+Q4pdpwpAJzxvInCxMRteKVzckBWDlA=
c1.jr.lixis.cz ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIB8ypV/mInwMI10+QMFD1z/W6eW4m9mSTa3YsWV3+OSI
dizzy$
| 1 | Jméno nebo IP adresa stroje. |
| 2 | Veřejný klíč stroje. Až jsem je to jeden řádek. |
Veřejné klíče serveru
Veřejné klíče serveru jsou určeny k prokazování totožnosti stroje. Je to součást konfigurace sshd serveru.
Jsou obvykle v souborech:
dizzy# cat /etc/ssh/ssh_host_dsa_key.pub
ssh-dss AAAAB3NzaC1kc3MAAACBAIKCGA5/aZRtWZNsDGpqrpXBN1ujneJ5n+NlmBWbw28L8co/QKuq84yP4OpTIYz1yLq6Omf5TG2y4sZr5qqym74RMXRJKT/IBJHfU81zf0GIdBiGEjsLxnmS8yRjSF39HIxGCsHplPELKmo+b8mxaJKKp1cKU4CuIlB2yj9qOMa/AAAAFQCdhIOFkE+kIG2ok/TTGLsy4RkPdQAAAIAgLYDthNmvwnaL33eN8AsAQV690ukbHvqx0fZwh69LJZbMnF8S3miM/A7SH5O/ogFeMExEmN8N9BEXwxdaEZ36SMFLU91U28Tre08DN7ZHxPFn52cadZ5bZPrakuoXDPV9IRvkh09ghReeaS/c28B9nWcdDSeZLC/KAIDo8fXT9gAAAIAc2NqRAoZzFiGfNuj58iB9RJIRYZ1qLuLEiGsLuALGLnSs7Jwwm+nszJG2+CLyP4ypA66MY8qcSI4VPyGBWT5dqWPDwmm9qOwghCihaWbXQjrTaFW7T/tND0wCdEwZbXeTiQJ0LaHhMVsJKsGg36ctc4rW2W+2cHpvbTNuT0JeHw== root@dizzy.chorche.net
dizzy# cat /etc/ssh/ssh_host_ecdsa_key.pub
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBH8uUONyJCMjmNGhGJnl5AH+mHGQ/YDuKqqBoMgT31Ng9VpEvotQpMCTk3SMK2539VRkB2r9cQ6RtzKkSIwnTjU= root@dizzy.chorche.net
dizzy# cat /etc/ssh/ssh_host_ed25519_key.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINj1UXz/+s+C1IIfjbY7TlkTfnxSN8tTxB5GkP8b/fZE root@dizzy.chorche.net
dizzy# cat /etc/ssh/ssh_host_rsa_key.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCgftWg9e7kJO0sqsYxevrNkUSee1ccraCzZPLdHwdVmub67h9kzggEfXNFrFN10EpOKD+DSNy9RiyARnb98K/AHI+j8yCmVpNrqls1T3jIQcKsWRgCk7JLbkouL6Ly1SjqG3qhIB6pZPa2C0WJSPN9aVWkiyxBN0gE23PtZE30TzTh/Vwf3aSpEMH9s2bfDJjuXPupyAEiB/EeKfLM17kwoHx1nbtkLO6FVY38q/kr3ysqk0NlzaO73evBLhZAyX75BVm1FbLyQnczZQkJh9YjJt6ka44/7QTn8xNH5Kmzpg0ZRUgX7po5xPsFHgZz7sufYcPz+lPDDpcxXFx2ONS7 root@dizzy.chorche.net
Tomu odpovídají i privátní klíče serveru, které z pochopitelných důvodů nebudu zobrazovat. Jsou v odpovídajících souborech:
/etc/ssh/ssh_host_dsa_key
/etc/ssh/ssh_host_ecdsa_key
/etc/ssh/ssh_host_ed25519_key
/etc/ssh/ssh_host_rsa_key
Zabezpečení
Zabezpečení klienta je jednoduché. Stačí dodržovat tyto tři zásady:
Nikdy nesmíme nikomu prozradit naše heslo ke vzdálenému účtu. Heslo nesmí být jednoduché.
Nikdy nesmíme nikomu prozradit heslo k našemu privátnímu klíči. Heslo nesmí být jednoduché.
Privátní klíč se nesmí dostat nikomu jinému do ruky (zvláště, pokud není chráněn heslem).
Zabezpečení serveru. Je nutno dodržovat tyto zásady:
Root musí mít pořádné heslo.
Nikdy nesmíme nikomu prozradit naše heslo roota.
Nebudeme používat heslo roota k něčemu jinému.
Pokud někomu chceme dát přístup roota, ať se přihlašuje klíčem. Když už to nebude potřeba, smažeme jeho klíč z /root/.ssh/authorized_keys
Nuťme uživatele, aby měli pořádná hesla, anebo lépe aby se přihlašovali klíčem.
Pořádné heslo je třeba toto: solwekeELsk232;A3, ale špatně se pamatuje.
Pořádné heslo je i toto: NasPesSeNejmenuje13AzorAle31Alik, dobře se pamatuje.
Toto je nejmizernější heslo: heslo123456, za to by se mělo zavírat do vězení na půl roku.
Dodatečné zabezpečení OpenSSH na straně serveru (pro administrátory)
Secure shell podléhá častým útokům darebáků z internetu.
Zabezpečení přesunem na jiný port
Secure shell (ssh) poslouchá obvykle na dobře známém portu (well known port) TCP 22. Darebáci to vědí a zkoušejí hesla roota i jiných uživatelů.
První způsob zabezpečení je přesunout tento port na nějaký jiný. Třeba 22022, nebo 36022. To je lepší. Má to však nevýhodu v tom, že si to musíme pamatovat a přihlašovat se na server s parametrem totoho portu:
ssh -p 22022 root@server
Zakážeme přihlášení heslem
Pokud zakážeme přihlašování heslem, darebáci nemají co hádat.
V /etc/ssh/sshd_config nastavíme:
PermitRootLogin prohibit-password |
zakazujeme rootovi přihlašování heslem |
PermitRootLogin no |
zakazujeme přihlášení roota kompletně |
PasswordAuthentication no |
kompletně zakazujeme přihlašování heslem |
Pomůžeme ssh, blokujeme darebáky firewallem
Apr 17 19:42:24 fw sshd[93389]: Failed password for root from 143.244.138.115 port 43352 ssh2 (1)
Apr 17 19:42:24 fw sshd[93389]: Received disconnect from 143.244.138.115 port 43352:11: Bye Bye [preauth]
Apr 17 19:42:24 fw sshd[93389]: Disconnected from authenticating user root 143.244.138.115 port 43352 [preauth]
Apr 17 19:43:20 fw sshd[7313]: Failed password for root from 157.230.6.216 port 56580 ssh2 (2)
Apr 17 19:43:20 fw sshd[7313]: Received disconnect from 157.230.6.216 port 56580:11: Bye Bye [preauth]
Apr 17 19:43:20 fw sshd[7313]: Disconnected from authenticating user root 157.230.6.216 port 56580 [preauth]
Apr 17 19:44:14 fw sshd[70684]: Failed password for root from 143.244.138.115 port 60788 ssh2
Apr 17 19:44:14 fw sshd[70684]: Received disconnect from 143.244.138.115 port 60788:11: Bye Bye [preauth]
Apr 17 19:44:14 fw sshd[70684]: Disconnected from authenticating user root 143.244.138.115 port 60788 [preauth]
Apr 17 19:44:56 fw sshd[95732]: Failed password for root from 157.230.6.216 port 45032 ssh2
Apr 17 19:44:56 fw sshd[95732]: Received disconnect from 157.230.6.216 port 45032:11: Bye Bye [preauth]
Apr 17 19:44:56 fw sshd[95732]: Disconnected from authenticating user root 157.230.6.216 port 45032 [preauth]
Apr 17 19:45:24 fw sshd[39567]: Connection closed by 186.156.178.35 port 59474 [preauth]
Apr 17 19:46:05 fw sshd[37091]: Invalid user abc from 143.244.138.115 port 44176
Apr 17 19:46:05 fw sshd[37091]: Failed password for invalid user abc from 143.244.138.115 port 44176 ssh2
Apr 17 19:46:05 fw sshd[37091]: Received disconnect from 143.244.138.115 port 44176:11: Bye Bye [preauth]
Apr 17 19:46:05 fw sshd[37091]: Disconnected from invalid user abc 143.244.138.115 port 44176 [preauth]
Apr 17 19:46:29 fw sshd[42432]: Failed password for root from 157.230.6.216 port 60794 ssh2
Apr 17 19:46:30 fw sshd[42432]: Received disconnect from 157.230.6.216 port 60794:11: Bye Bye [preauth]
Apr 17 19:46:30 fw sshd[42432]: Disconnected from authenticating user root 157.230.6.216 port 60794 [preauth]
Apr 17 19:48:00 fw sshd[33687]: Failed password for root from 157.230.6.216 port 36570 ssh2
Apr 17 19:48:01 fw sshd[33687]: Received disconnect from 157.230.6.216 port 36570:11: Bye Bye [preauth]
Apr 17 19:48:01 fw sshd[33687]: Disconnected from authenticating user root 157.230.6.216 port 36570 [preauth]
Apr 17 19:49:01 fw sshd[74201]: Connection closed by 186.156.178.35 port 45247 [preauth]
Apr 17 19:49:34 fw sshd[27265]: Failed password for root from 157.230.6.216 port 42602 ssh2
Apr 17 19:49:34 fw sshd[27265]: Received disconnect from 157.230.6.216 port 42602:11: Bye Bye [preauth]
Apr 17 19:49:34 fw sshd[27265]: Disconnected from authenticating user root 157.230.6.216 port 42602 [preauth]
Apr 17 19:51:10 fw sshd[56902]: Failed password for root from 157.230.6.216 port 59070 ssh2
Apr 17 19:51:10 fw sshd[56902]: Received disconnect from 157.230.6.216 port 59070:11: Bye Bye [preauth]
Apr 17 19:51:10 fw sshd[56902]: Disconnected from authenticating user root 157.230.6.216 port 59070 [preauth]
Apr 17 19:52:29 fw sshd[26138]: Connection closed by 186.156.178.35 port 59259 [preauth]
Apr 17 19:52:44 fw sshd[28494]: Invalid user abc from 157.230.6.216 port 41312
Apr 17 19:52:44 fw sshd[28494]: Failed password for invalid user abc from 157.230.6.216 port 41312 ssh2
Apr 17 19:52:44 fw sshd[28494]: Received disconnect from 157.230.6.216 port 41312:11: Bye Bye [preauth]
Apr 17 19:52:44 fw sshd[28494]: Disconnected from invalid user abc 157.230.6.216 port 41312 [preauth]
Apr 17 19:56:01 fw sshd[77082]: Accepted publickey for root from 46.253.96.146 port 64353 ssh2: ED25519 SHA256:O16P7xQbiYKL4Bx0VEWVTgdFj+WB5NkiCpqLn2oM/jM (3)
Apr 17 19:56:01 fw sshd[27752]: Connection closed by 186.156.178.35 port 45030 [preauth]
────────────────────────────────────────────────────────────────────────────────────────────────
fw# pfctl -t otravove -T add 85.190.201.85
1/1 addresses added.
fw# pfctl -t otravove -T add 46.101.146.252
0/1 addresses added.
fw# pfctl -t otravove -T add 43.143.47.12
0/1 addresses added.
fw# pfctl -t otravove -T add 195.87.80.171
1/1 addresses added.
fw# pfctl -t otravove -T add 183.146.30.163 (4)
1/1 addresses added.
fw#
[0] 0:ksh* "[root@fw.drevocomplet.cz" 19:56 17-Apr-23]"
| 1 | Darebák z IP adresy 143.244.138.115 louská heslo roota. |
| 2 | Další darebák z IP adresy 157.230.6.216 louská heslo roota. |
| 3 | Moje přihlášení, skutečného roota pomocí klíče. |
| 4 | Ruční přidávání IP adresy darebáka do tabulky firewallu <otravove> |
Zabezpečení pomocí paketového firewallu pf
Útočníky, kteří testují otravují a snaží se proniknout zastavíme na úrovni paketového firewallu.
Automat na přidávání darebáků do firewallu
Tento automat se spouští cronem každou minutu a prohledává logy sshd na různé incidenty.
fw# cat /root/bin/udelej_otravy.sh (1)
---------------------------------------
#!/bin/sh
# (c) Jirka Chráska <jirka@lixis.cz>
DATUM=`date +"%b %d %H"` (2)
cat /var/log/authlog | grep "$DATUM" | grep 'Failed password for root' | cut -d ':' -f 4 | cut -d ' ' -f 7 | sort | uniq >/tmp/otravove.txt (3)
cat /var/log/authlog | grep "$DATUM" | grep 'Failed password for invalid user' | cut -d ':' -f 4 | cut -d ' ' -f 9 | sort | uniq >/tmp/otravove.txt (4)
cat /var/log/authlog | grep "$DATUM" | grep 'Invalid user' | cut -d ':' -f 4 | cut -d ' ' -f 6 | sort | uniq >>/tmp/otravove.txt (5)
cat /var/log/authlog | grep "$DATUM" | grep 'Unable to negotiate with' | cut -d ':' -f 4 | cut -d ' ' -f 6 | sort | uniq >>/tmp/otravove.txt (6)
OTRAVOVE=`cat /tmp/otravove.txt` (7)
for O in $OTRAVOVE ; do (8)
pfctl -q -t otravove -T add $O (9)
done
pfctl -t otravove -T show >/etc/otravove.txt (10)
-------------------------------------
fw#
| 1 | Příkaz cat pro výpis shellového skriptu /root/bin/udelej_otravy.sh |
| 2 | Získání aktuálního času. |
| 3 | Pročesáváme logovací soubor /var/log/authlog a hledáme záznamy s aktuálním časem -1 hodina a louskáním hesla roota. Z těchto řádků vypreparujeme IP adresu útočníků, srovnáme je, vyházíme duplicity a uložíme do souboru /tmp/otravove.txt. |
| 4 | Pročesáváme logovací soubor /var/log/authlog a hledáme záznamy s aktuálním časem -1 hodina a louskáním hesla uživatele, který neexistuje. |
| 5 | Pročesáváme logovací soubor /var/log/authlog a hledáme záznamy s aktuálním časem -1 hodina a louskáním hesla uživatele, který neexistuje. |
| 6 | Pročesáváme logovací soubor /var/log/authlog a hledáme záznamy s aktuálním časem -1 hodina a zastaralými ssh klienty, kteří jenom otravují. |
| 7 | Přečteme celý soubor /tmp/otravove.txt, který obsahuje IP adresy (na jednom řádku je jedna IP adresa) |
| 8 | V cyklu procházíme jednotlivé řádky souboru. |
| 9 | IP adresu, uloženou v proměnné $O přidáváme do tabulky firewallu <otravove> |
| 10 | Tabulku firewallu <otravove> si uložíme do souboru /etc/otravove.txt, protože darebáci budou blokování firewallem na věky věkův.
Blokovací pravidlo firewallu: block in quick on egress from <otravove> |
Příště se podíváme na ssh klienty použitelné na Windows, putty a bitvise. OpenSSH server pro Windows je dostupný až pro systémy Windows 10 a výše.