# Зміна стандартного порта SSH

## В теорії все просто:

#### 1. Відредагуй конфігураційний файл SSH:

```bash
sudo nano /etc/ssh/sshd_config
```

#### 2. Знайди рядок:

```plaintext
#Port 22
```

і зміни його, знявши коментар та вказавши інший порт (наприклад, тут 2222 ***але краще інший!***, бо це теж розповсюджений варіант):

```plaintext
Port 2222
```

**Не обирай порти, що вже використовуються іншими службами!** Наприклад:

* 80 (HTTP)
* 443 (HTTPS)
* 3306 (MySQL)
* 21 (FTP)
* 25 (SMTP)

**Рекомендовано:** порти від 1025 до 65535.

***

#### 3. Перезапусти SSH:

```bash
sudo systemctl restart ssh
```

***

#### 5. Перевір, чи SSH працює на новому порту:

З іншої сесії терміналу (не закривай активну!), спробуй підключитися:

```bash
ssh -p 2222 username@server-ip
```

## На практиці - не працювало.

На сервері (Zomro) в `/etc/ssh/`  мав два файла конфигурації `sshd_config` і `ssh_config` . Я так і не зрозумів, чому по інструкції ми правимо sshd\_config, а рестартуємо ssh.

Причому, рестарт sshd - видавав помилку.

Тому я вніс правки в ці два файли:

/etc/ssh/sshd\_config

```
Include /etc/ssh/sshd_config.d/*.conf

Port 2222
#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  # waiting for password
LoginGraceTime 20
PermitRootLogin yes
#StrictModes yes
MaxAuthTries 3
#MaxSessions 10

PubkeyAuthentication yes

# Expect .ssh/authorized_keys2 to be disregarded by default in future.
#AuthorizedKeysFile     .ssh/authorized_keys .ssh/authorized_keys2

#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
#PermitEmptyPasswords no

# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
KbdInteractiveAuthentication no

...
```

/etc/ssh/ssh\_config

```
Include /etc/ssh/ssh_config.d/*.conf

Host *
#   ForwardAgent no
#   ForwardX11 no
#   ForwardX11Trusted yes
#   PasswordAuthentication yes
#   HostbasedAuthentication no
#   GSSAPIAuthentication no
#   GSSAPIDelegateCredentials no
#   GSSAPIKeyExchange no
#   GSSAPITrustDNS no
#   BatchMode no
#   CheckHostIP no
#   AddressFamily any
#   ConnectTimeout 0
#   StrictHostKeyChecking ask
#   IdentityFile ~/.ssh/id_rsa
#   IdentityFile ~/.ssh/id_dsa
#   IdentityFile ~/.ssh/id_ecdsa
#   IdentityFile ~/.ssh/id_ed25519
Port 2222
#   Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc
#   MACs hmac-md5,hmac-sha1,umac-64@openssh.com
#   EscapeChar ~
#   Tunnel no
#   TunnelDevice any:any
#   PermitLocalCommand no
#   VisualHostKey no
#   ProxyCommand ssh -q -W %h:%p gateway.example.com
#   RekeyLimit 1G 1h
#   UserKnownHostsFile ~/.ssh/known_hosts.d/%k
    SendEnv LANG LC_*
    HashKnownHosts yes
    GSSAPIAuthentication yes

```

і перезавантажив сервер (бо `sudo systemctl restart ssh` не давало результату). І тільки після цього в мене запрацювало з'єднання через інший порт, а через 22 - перестало з'єднуватись.

### Далі - теорія (не все прийняв)

Можливість підключитися до сервера чи комп’ютера, фізично перебуваючи іншому кінці міста, країни, земної кулі, є незаперечним благом. Однак, як це часто буває, переваги отримують не лише законні користувачі, а й зловмисники. Віддалений доступ за SSH протоколом не став винятком.

Що ж являє собою цей спосіб зв’язку з сервером і як зробити підключення максимально безпечним?

* [Що являє собою SSH з’єднання](https://vps.ua/wiki/ukr/enhancing-ssh-security/#a-1)
* [Налаштування параметрів підключення до SSH](https://vps.ua/wiki/ukr/enhancing-ssh-security/#a-2)
* [Закриття порту SSH](https://vps.ua/wiki/ukr/enhancing-ssh-security/#a-3)

### Що являє собою SSH з’єднання <a href="#a-1" id="a-1"></a>

SSH (Secure shell) — мережевий протокол, призначений для отримання безпечного віддаленого доступу до операційної системи та керування нею.

У Linux системах підключення за захищеним протоколом здійснюється за допомогою наступної команди:

**ssh user\_name\@remote\_host**

Під віддаленим хостом у разі мається на увазі IP-адреса чи домен, до якого ви хочете подключиться. Для входу на сервер, система запросить ввести пароль авторизації. Після успішного підключення ви отримаєте доступ до керування пристроєм через командний рядок.

Щоб перервати з’єднання і повернутися до локальної сесії, достатньо ввести в консолі ***exit***.

У разі використання операційної системи Windows можна скористатися SSH-клієнтом PuTTy, робота з яким описана [в нашій статті](https://vps.ua/wiki/ukr/connect-ssh/).

### Налаштування параметрів підключення по SSH <a href="#a-2" id="a-2"></a>

Необхідно розуміти, що використання такого блага як ssh-з’єднання тягне за собою і ризик зазнати хакерської атаки. Зловмисники можуть спробувати проникнути на ваш віддалений сервер, використовуючи логін та пароль. Щоб звести можливість успішної атаки до мінімуму, скористаємося доступними нам засобами, а саме — зміною налаштувань підключення.

Є кілька основних параметрів, налаштування яких допоможе зробити ваше підключення безпечнішим.

Про всяк випадок створюємо резервну копію конфігураційного файлу з налаштуваннями:

***cp /etc/ssh/sshd\_config{,.bak}***

Приставка {,.bak} дозволяє скопіювати файл із зазначеним ім’ям та розширенням bak, яке присвоюється резервним копіям.

Тепер через текстовий редактор, наприклад, vim, emacs, [nano](https://vps.ua/wiki/ukr/text-editor-nano/), відкриваємо файл /etc/ssh/sshd\_config і вносимо в нього основні правки. З метою підвищення безпеки SSH з’єднання нас цікавлять такі параметри:

1. PermitRootLogin
2. AllowUsers, AllowGroups
3. DenyUsers, DenyGroups
4. Port
5. ListenAddress
6. Login GraceTime
7. ClientAliveInterval
8. HostbasedAuthentication.

Далі поговоримо про те, які значення необхідно встановити для зазначених параметрів, щоб ускладнити зловмисникам доступ до сервера.

**PermitRootLogin**\
Цей параметр встановлює дозвіл на вхід у систему як користувач. Для підвищення безпеки з’єднання рекомендується вимкнути таку можливість. змінити встановлене у файлі значення «Yes» на «No»:

***PermitRootLogin no***

За таких умов виконувати команди з правами користувача після входу на сервер можна буде за допомогою функцій su або sudo.

**AllowUsers, AllowGroups**\
Коли в системі створено багато користувачів, то згідно з початковими налаштуваннями кожен з них має можливість віддаленого доступу по SSH. Щоб дозволити доступ лише для певного кола осіб (і, відповідно, заборонити його для всіх інших), існують параметри AllowUsers та AllowGroups. Запис у конфігураційному файлі має, відповідно, вигляд:

<pre><code><strong>AllowUsers user1 user2 user3
</strong><strong>AllowGroups group1 group2 group3
</strong></code></pre>

де через пропуск перераховані імена користувачів та назви груп, яким дозволено підключення до сервера за SSH.

**DenyUsers, DenyGroups**\
Коли користувачів у системі багато і потрібно надати віддалений доступ більшості з них, при цьому заборонивши його окремим особам та групам, файл ***sshd\_config*** вносить правки до параметрів DenyUsers, DenyGroups. Навпроти цих параметрів, аналогічно до прикладу з AllowUsers, AllowGroups, перераховуємо імена користувачів та груп, яким буде відмовлено у доступі на сервер SSH.

<pre><code><strong>DenyUsers user1 user2
</strong><strong>DenyGroups group1 group2
</strong></code></pre>

У попередніх пунктах йшлося про налаштування, які дозволять розпізнати неавторизованого користувача та заборонити підключення. Однак зловмисники часто використовують метод підбору логіну та паролю, намагаються потрапити на сервер шляхом введення раніше вкрадених даних.

**Port**\
Щоб ускладнити завдання хакерам, варто подбати про гарне маскування свого ssh-порту.

За замовчуванням ssh-з’єднання здійснюватиметься через 22-й порт. Щоб порт для підключення не був такий очевидний, [змініть порт SSH](https://vps.ua/wiki/ukr/changing-ssh-port/) на будь-який інший, бажано найменш стандартний, наприклад:

***Port 22540***

**ListenAddress**\
Крім того, що ssh-з’єднання налаштовано на певному порті, підключення здійснюється на різних мережевих інтерфейсах. Іншими словами, сервер слухає безліч IP-адрес. Існує можливість вказати в конфігураційному файлі конкретні адреси інтерфейсів для входу на сервер за допомогою ListenAddress. Наприклад:

***ListenAddress 192.168.1.2***

**Login GraceTime**\
За замовчуванням, при підключенні до сервера по ssh користувач має 2 хвилини для введення логіну і пароля. Такого проміжку більш ніж достатньо, причому не лише для авторизованого користувача, а й для хакера. Тому час очікування на введення цих даних варто обмежити до 30-60 секунд, залежно від ваших уподобань.

***Login GraceTime 30***

**ClientAliveInterval**\
Цей параметр призначений для визначення часу бездіяльності користувача, після якого з’єднання автоматично розривається. Період очікування необхідно вказати в секундах, наприклад:

***ClientAliveInterval 300***

**HostbasedAuthentication**\
Також варто вимкнути авторизацію користувача на основі хоста за допомогою директиви:

***HostbasedAuthentication не***

Найкраще скористатися автентифікацією на основі ключів.

Крім перелічених у конфігураційному файлі налаштувань, захистити своє openSSH-з’єднання допоможе хороший пароль, не пов’язаний з персональними даними, але містить великі й маленькі літери, цифри і спеціальні символи. [Змінити пароль на сервері](https://vps.ua/wiki/ukr/change-root-password-vps/) можна безліччю способів. Якщо не бажаєте складати пароль самостійно, використовуйте генератор випадкових паролів.

### Закриття порту SSH <a href="#a-3" id="a-3"></a>

Ще однією перешкодою для злому вашого сервера є закриття SSH-порту або port knocking. Особливо актуально використовувати цю технологію для серверів, які не призначені для загального доступу (наприклад, сервери зберігання конфіденційних даних компанії тощо).

Суть port knocking полягає в тому, що всі порти сервера спочатку закриті для зовнішніх підключень. Відкриття порту та можливість доступу до нього здійснюється за рахунок застосування певної послідовності стуків. Ця технологія використовується як додаток до наведених вище налаштувань, застосування паролів та ключів.

Механізм роботи port knocking досить простий. Ви встановлюєте на сервер демон **knockd**, налаштовуєте необхідну послідовність стуків у файлі */etc/knockd.conf* і отримуєте нехитрий у використанні, але надійний на практиці інструмент протидії хакерам. Справа в тому, що в інтернет-просторі налічується близько 60 000 вільних портів, через які можна здійснити SSH-підключення. Для доступу до порту використовують, як правило, послідовність з трьох стуків. Це означає, що підібрати правильний набір портів випадковим чином або їх прорахувати стає дуже складно, а це саме те, чого ми домагаємося.

Отже, встановлюємо knockd демон:

***sudo apt-get install knockd*** – для Ubuntu\
\&#xNAN;***sudo aptitude install knockd*** – для Debian

Тепер у конфігураційному файлі /etc/knockd.conf налаштовуємо послідовність стуків, яка відкриватиме наш порт. Для цього в секції sequence перераховуємо через кому без пропуску номери портів, наприклад:

***sequence = 6240,7000,8490***

Коли ви намагаєтеся «достукатися» до порту, передача даних здійснюється за протоколом TCP. Проте, для підвищення рівня безпеки з’єднання можна додати інші протоколи, наприклад UDP:

***sequence = 6240,7000: udp, 8490***

Пакети TCP, які надходять на сервер, потребують різних дій з боку системи. Щоб уникнути зайвого навантаження та відфільтрувати зайве, використовують параметр TCPFlags, який також прописують у файлі /etc/knockd.conf:

***tcpflags = syn***

Прапор SYN означає запит на з’єднання. Тобто демон knockd скануватиме лише ті пакети, які містять запит на з’єднання з сервером.

Вище ми говорили, що SSH-підключення здійснюється на різних мережевих інтерфейсах. За замовчуванням knockd розрахований на роботу з eth0. Щоб дати можливість демону контролювати інші інтерфейси, наприклад, eth1, до файлу /etc/knockd.conf додамо рядок:

***Interface=eth1***

Щоб «постукати» в порт, потрібен певний час. Якщо ви знаєте, яку послідовність потрібно ввести, достатньо 15-30 секунд. Саме цією межею варто обмежити максимальний час, необхідний для завершення послідовності стуків:

***seq\_timeout = 20***

Згідно з прикладом, через 20 секунд система зчитує введену інформацію. Відповідно, якщо правильна послідовність не була завершена до закінчення цього часу, вам буде відмовлено у доступі та порт не відкриється.

Оскільки логін та пароль авторизації можуть бути викрадені зловмисниками, буде не зайвим за аналогією з seq\_timeout встановити обмеження на час їх введення:

***cmd\_timeout = 30***

Відповідно, через 30 секунд порт закриється, якщо дані для авторизації не будуть успішно введені.

Ми вже налаштували послідовність стуків для відкриття потрібного порту SSH, вказали обмеження по часу. Однак, щоб коректно працювати, knockd повинен знати, які дії йому необхідно виконати, якщо стуки були правильними, а також якщо в доступі потрібно відмовити.

Для цього існують команди start\_command та stop\_command, відповідно.

Якщо послідовність стуків вірна, демон повинен відкрити порт SSH, через який необхідно здійснити підключення. Для цього у конфігураційному файлі /etc/knockd.conf прописуємо команду для start\_command:

<pre><code><strong>start_command= /usr/sbin/iptables -A INPUT -s %IP% -p tcp --dport 22716 -j ACCEPT
</strong></code></pre>

У разі, коли стуки були неправильними або користувач не встиг її ввести повністю до закінчення відведеного часу, knockd робить порт недоступним (невидимим).

<pre><code><strong>stop_command= /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 22716 -j ACCEPT
</strong></code></pre>

Фактично ми налаштовуємо правила iptables (брандмауера), де:

* INPUT означає вхідний пакет
* -A та -D — додавання та видалення правила, відповідно
* -s — IP джерело пакету
* %IP% — адреса, з якої йде запит на відкриття порту
* -p — протокол (у разі tcp)
* –dport — SSH-порт, який ми хочемо відкрити
* -j — ключ, що вказує на дію над пакетом (accept — прийняти)

Коли все налаштовано та готове до роботи, запускаємо демон у фоновому режимі за допомогою команди **knockd -d**.

Тепер ми можемо отримати віддалений доступ до сервера SSH, вказавши в консолі правильну послідовність портів через пробіл. Після цього ви побачите порт, що відкрився, і пропозицію ввести пароль свого облікового запису:

<pre><code><strong>knock адреса_сервера 6240 7000:udp 8490
</strong><strong>ssh адреса_сайту -p 22716 -o ConnectTimeout=30
</strong><strong>Password:
</strong></code></pre>

Як бачите, на введення даних дається 30 секунд.

Адреса сервера, до якого ви підключаєтеся, може бути виражена двома способами:

* IP-адресою;
* хостнеймом.

У першому випадку запит на підключення буде виглядати так:

***ssh -p 22716 username\@1.1.1.1***

Якщо підключення йде до сервера через hostname, запит має такий вигляд:

***ssh -p 22716 <username@server.vps.ua>***

Часто доступність системи для хакерів пов’язана з вразливістю операційної системи. Розробники регулярно перевіряють наявність слабких місць у своєму продукті і випускають досконалішу версію, закриваючи подібні лазівки для зловмисників. Тому не забувайте своєчасно оновлювати програмне забезпечення та утиліти.
