Коротка шпаргалка Linux для нових користувачів хостингу: від логіну на сервер до налаштування веб-сервера.

Адміністрування 20 хв. на читання

Недосвідченому користувачеві, якому з тих чи інших причин вперше довелося орендувати віртуальний сервер або виділений сервер, навігація та робота серед Linux можуть здатися складними. Тим не менш, за допомогою цього короткого посібника з Linux для розміщення користувачів ви отримаєте уявлення, загальне розуміння та приклади, необхідні для впевненого керування вашим сервером. У цьому посібнику ми намагатимемося висвітлити всі аспекти, які будуть вам корисні при першому знайомстві з вашим сервером - від входу на сервер по SSH, до початкового налаштування веб-сервера. Давайте поринемо!

 

 

Розділ 1: Вхід на свій сервер через SSH та основні команди Linux

 

1.1 Короткий опис протоколу SSH

SSH, скорочення від Secure Shell, є криптографічний мережевий протокол, який дозволяє безпечно підключатися до віддаленого сервера через незахищену мережу. Він забезпечує зашифроване з'єднання та дозволяє віддалено виконувати команди на сервері. Щоб встановити з'єднання SSH, вам знадобиться IP-адреса вашого сервера, ваше ім'я користувача та номер порту SSH. Наприклад, щоб увійти на сервер з IP-адресою "123.456.789.0", використовуючи ім'я користувача "admin" і порт SSH за замовчуванням 22, ви повинні використовувати команду:

ssh [email protected] -p 22

 

 

1.2 Генерація SSH ключів

Ключі SSH забезпечують безпечніший та зручний спосіб аутентифікації при вході на сервер. Щоб створити пару ключів SSH, ви можете використовувати команду ssh-keygen. Наприклад, щоб згенерувати пару ключів RSA з налаштуваннями за промовчанням, ви повинні запустити:

 

ssh-keygen -t rsa

 

Ця команда згенерує закритий ключ (id_rsa) та відкритий ключ (id_rsa.pub). Відкритий ключ необхідно помістити у файл ~/.ssh/authorized_keys на сервері.

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

 

Вхід на сервер по ключу здійснюється наступною командою:

 

ssh [email protected] -i ~/.ssh/id_rsa

 

де параметр "-i" вказує на розташування вашого закритого ключа на вашому комп'ютері.

Докладніше про всі можливості SSH ви можете дізнатися ТУТ.

 

 

1.3 Основные команды Linux

 

Після входу на сервер через SSH ви можете використовувати різні команди для навігації по каталогах, списку файлів, передачі файлів і управління дозволами. Ось кілька прикладів:

 

pwd - відображення поточного (робочого) каталогу.

[user@testhost ~]$ pwd
/home/user

 

date - Відображення поточної дати та часу системи.

[user@testhost ~]$ date
Mon Dec 16 13:37:07 UTC 2019
[user@testhost ~]$ date +%s
1576503430

 

w - Ця команда показує, хто увійшов до системи. Крім того, на екрані також відображається час безвідмовної роботи та LA (середнє завантаження).

[user@testhost ~]$ w
 05:47:17 up 377 days, 17:57,  1 user,  load average: 0,00, 0,01, 0,05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
user     pts/0    32.175.94.241    05:47    2.00s  0.01s  0.00s w

 

ls - Відображає вміст каталогу. Якщо не передати шлях, відображатиметься вміст поточного каталогу.

[user@testhost ~]$ pwd
/home/user
[user@testhost ~]$ ls
qqq
[user@testhost ~]$ ls /home/user
qqq
[user@testhost ~]$ ls /
bin  boot  cgroup  dev  etc  home  lib  lib64  local  lost+found  media  mnt  opt  proc  root  run  sbin  selinux  srv  swap  sys  tmp  usr  var

 

Найзручніше використовувати опції -l (формат довгого списку - виведення в стовпець з додатковою інформацією про файли), -t (сортування за часом модифікації файлу/директорії) і -r (зворотне сортування - у поєднанні з -t, найсвіжіші файли) будуть внизу):

[user@testhost ~]$ ls -ltr /
total 4194416
drwxr-xr-x    2 root root       4096 Jan  6  2012 srv
drwxr-xr-x    2 root root       4096 Jan  6  2012 selinux
drwxr-xr-x    2 root root       4096 Jan  6  2012 mnt
drwxr-xr-x    2 root root       4096 Jan  6  2012 media
drwx------    2 root root      16384 Oct  1  2017 lost+found
drwxr-xr-x    2 root root       4096 Oct  1  2017 local
drwxr-xr-x   13 root root       4096 Oct  1  2017 usr
drwxr-xr-x   11 root root       4096 Apr 10  2018 cgroup
drwxr-xr-x    4 root root       4096 Apr 10  2018 run
-rw-------    1 root root 4294967296 Sep 10  2018 swap
dr-xr-xr-x   10 root root       4096 Dec 13  2018 lib
drwxr-xr-x    6 root root       4096 Mar  7  2019 opt
drwxr-xr-x   20 root root       4096 Mar 19  2019 var
dr-xr-xr-x   10 root root      12288 Apr  9  2019 lib64
dr-xr-xr-x    2 root root       4096 Apr  9  2019 bin
dr-xr-xr-x    4 root root       4096 Apr  9  2019 boot
dr-xr-xr-x    2 root root      12288 Apr  9  2019 sbin
dr-xr-xr-x 3229 root root          0 Jul  2 10:19 proc
drwxr-xr-x   34 root root       4096 Oct 28 13:27 home
drwxr-xr-x   93 root root       4096 Oct 30 16:00 etc
dr-xr-x---   11 root root       4096 Nov  1 13:02 root
dr-xr-xr-x   13 root root          0 Nov 13 20:28 sys
drwxr-xr-x   16 root root       2740 Nov 26 08:55 dev
drwxrwxrwt    3 root root       4096 Nov 26 08:57 tmp

 

У Linux є 2 спеціальні імені каталогу: "." та "..". Перший означає поточний каталог, другий - батьківський каталог. Їх зручно використовувати в різних командах, зокрема ls:

[user@testhost home]$ pwd
/home
[user@testhost home]$ ls ..
bin  boot  cgroup  dev  etc  home  lib  lib64  local  lost+found  media  mnt  opt  proc  root  run  sbin  selinux  srv  swap  sys  tmp  usr  var
[user@testhost home]$ ls ../home/user/
qqq

 

Також є корисна опція для відображення прихованих файлів (починаються з ".") - -a:

[user@testhost ~]$ ls -a
.  ..  1  .bash_history  .bash_logout  .bash_profile  .bashrc  .lesshst  man_signal  man_signal_error_log  .mongorc.js  .ssh  temp  test  .viminfo

 

А ще можна використовувати опцію -h - висновок у форматі, що читається легко (зверніть увагу на розміри файлів):

[user@testhost ~]$ ls -ltrh
total 16K
-rwxrwx--x 1 user user   31 Nov 26 11:09 temp
-rw-rw-r-- 1 user user 6.0K Dec  3 16:02 1
drwxrwxr-x 2 user user 4.0K Dec  4 10:39 test

 


cd - Змiнити поточний каталог.

[user@testhost ~]$ pwd
/home/user
[user@testhost ~]$ cd /home/
[user@testhost home]$ pwd
/home

 

Якщо ви не передасте ім'я каталогу як аргумент, використовуватиметься змінна оточення $HOME, тобто домашній каталог. Також може бути зручно використовувати `~`, спеціальний символ, що означає $HOME:

[user@testhost etc]$ pwd
/etc
[user@testhost etc]$ cd ~/test/
[user@testhost test]$ pwd
/home/user/test

 

mkdir - Створити директорію.

[user@testhost ~]$ mkdir test
[user@testhost ~]$ ls -ltr
total 38184
-rw-rw-r-- 1 user user 39091284 Nov 22 14:14 qqq
drwxrwxr-x 2 user user     4096 Nov 26 10:29 test

 

Іноді потрібно створити певну структуру каталогів: наприклад, каталог усередині неіснуючого каталогу. Щоб не вводити mkdir кілька разів поспіль, можна використовувати опцію -p - вона дозволяє створити всі каталоги, що відсутні, в ієрархії. Також з цією опцією mkdir не повертатиме помилку, якщо каталог існує.

[user@testhost ~]$ ls
qqq  test
[user@testhost ~]$ mkdir test2/subtest
mkdir: cannot create directory ‘test2/subtest’: No such file or directory
[user@testhost ~]$ mkdir -p test2/subtest
[user@testhost ~]$ ls
qqq  test  test2
[user@testhost ~]$ ls test2/
subtest
[user@testhost ~]$ mkdir test2/subtest
mkdir: cannot create directory ‘test2/subtest’: File exists
[user@testhost ~]$ mkdir -p test2/subtest
[user@testhost ~]$ ls test2/
subtest


rm - Видалити файл.

[user@testhost ~]$ ls
qqq  test  test2
[user@testhost ~]$ rm qqq
[user@testhost ~]$ ls
test  test2

 

Опція -r дозволяє рекурсивно видаляти каталоги з усім вмістом, опція -f дозволяє ігнорувати помилки при видаленні (наприклад, про неіснуючий файл). Ці опції дозволяють, грубо кажучи, гарантовано видалити всю ієрархію файлів і каталогів (якщо у користувача є на це права), тому користуватися ними потрібно з обережністю (класичний приклад анекдоту - "rm -rf/", за певних обставин він видалить вам якщо не всю систему, то масу файлів, важливих її працездатності).

[user@testhost ~]$ ls
test  test2
[user@testhost ~]$ ls -ltr test2/
total 4
-rw-rw-r-- 1 user user    0 Nov 26 10:40 temp
drwxrwxr-x 2 user user 4096 Nov 26 10:40 temp_dir
[user@testhost ~]$ rm -rf test2
[user@testhost ~]$ ls
test


cp - Копіювати файл або директорію.

[user@testhost ~]$ ls
temp  test
[user@testhost ~]$ cp temp temp_clone
[user@testhost ~]$ ls
temp  temp_clone  test

Ця команда також має параметри -r і -f, які можна використовувати для копіювання ієрархії каталогів і папок в інше місце.

 

mv - Видалити або перейменувати файл або каталог.

[user@testhost ~]$ ls -ltr
total 4
drwxrwxr-x 2 user user 4096 Nov 26 10:29 test
-rw-rw-r-- 1 user user    0 Nov 26 10:45 temp
-rw-rw-r-- 1 user user    0 Nov 26 10:46 temp_clone
[user@testhost ~]$ ls test
[user@testhost ~]$ mv test test_renamed
[user@testhost ~]$ mv temp_clone test_renamed/
[user@testhost ~]$ ls
temp  test_renamed
[user@testhost ~]$ ls test_renamed/
temp_clone


cat - Вивести вміст файлу чи файлів у консоль.

[user@testhost ~]$ cat temp
Content of a file.
Lalalala...

Також слід звернути увагу на команду head (друкувати перші n рядків або байтів файлу) та tail (про це пізніше).

 

tail - Вивести останні n рядків чи байтів файлу.

[user@testhost ~]$ tail -1 temp
Lalalala...

Опція -f дуже корисна - вона дозволяє відображати нові дані у файлі в режимі реального часу.

 

less - Іноді текстовий файл дуже великий і його незручно виводити командою cat. Потім його можна відкрити командою less: файл відображатиметься частинами, доступна навігація цими частинами, пошук та інший простий функціонал.

[user@testhost ~]$ less temp

 

Також може бути зручно використовувати less з пайплайном (pipe):

[user@testhost ~]$ grep "ERROR" /tmp/some.log | less


ps - Показати перелік процесів.

[user@testhost ~]$ ps
    PID TTY          TIME CMD
 761020 pts/2    00:00:00 bash
 809720 pts/2    00:00:00 ps

 

Зручно використовувати опцію BSD "aux" для виведення всіх процесів у системі (оскільки процесів може бути багато, ми виводимо лише перші 5 з них за допомогою конвеєра (pipe) та команди head):

[user@testhost ~]$ ps aux | head -5
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.0  19692  2600 ?        Ss   Jul02   0:10 /sbin/init
root           2  0.0  0.0      0     0 ?        S    Jul02   0:03 [kthreadd]
root           4  0.0  0.0      0     0 ?        I<   Jul02   0:00 [kworker/0:0H]
root           6  0.0  0.0      0     0 ?        I<   Jul02   0:00 [mm_percpu_wq]

 

Багато хто також використовують опцію BSD "axjf", яка дозволяє вам роздрукувати дерево процесів (я видалив частину виведення тут для демонстраційних цілей):

[user@testhost ~]$ ps axjf
   PPID     PID    PGID     SID TTY        TPGID STAT   UID   TIME COMMAND
      0       2       0       0 ?             -1 S        0   0:03 [kthreadd]
      2       4       0       0 ?             -1 I<       0   0:00  \_ [kworker/0:0H]
      2       6       0       0 ?             -1 I<       0   0:00  \_ [mm_percpu_wq]
      2       7       0       0 ?             -1 S        0   4:08  \_ [ksoftirqd/0]
...
...
...
      1    4293    4293    4293 tty6        4293 Ss+      0   0:00 /sbin/mingetty /dev/tty6
      1  532967  532964  532964 ?             -1 Sl     495   0:00 /opt/td-agent/embedded/bin/ruby /usr/sbin/td-agent --log /var/log/td-agent/td-agent.log --use-v1-config --group td-agent --daemon /var/run/td-agent/td-agent.pid
 532967  532970  532964  532964 ?             -1 Sl     495 803:06  \_ /opt/td-agent/embedded/bin/ruby /usr/sbin/td-agent --log /var/log/td-agent/td-agent.log --use-v1-config --group td-agent --daemon /var/run/td-agent/td-agent.pid
      1  537162  533357  532322 ?             -1 Sl       0 5067:43 /usr/bin/dockerd --default-ulimit nofile=262144:262144 --dns=172.17.0.1
 537162  537177  537177  537177 ?             -1 Ssl      0 4649:28  \_ docker-containerd --config /var/run/docker/containerd/containerd.toml
 537177  537579  537579  537177 ?             -1 Sl       0   4:48  |   \_ docker-containerd-shim -namespace moby -workdir /var/lib/docker/containerd/daemon/io.containerd.runtime.v1.linux/moby/0ee89b20deb3cf08648cd92e1f3e3c661ccffef7a0971
 537579  537642  537642  537642 ?             -1 Ss    1000  32:11  |   |   \_ /usr/bin/python /usr/bin/supervisord -c /etc/supervisord/api.conf
 537642  539764  539764  537642 ?             -1 S     1000   0:00  |   |       \_ sh -c echo "READY"; while read -r line; do echo "$line"; supervisorctl shutdown; done
 537642  539767  539767  537642 ?             -1 S     1000   5:09  |   |       \_ php-fpm: master process (/etc/php73/php-fpm.conf)
 539767  783097  539767  537642 ?             -1 S     1000   0:00  |   |       |   \_ php-fpm: pool test
 539767  783131  539767  537642 ?             -1 S     1000   0:00  |   |       |   \_ php-fpm: pool test
 539767  783185  539767  537642 ?             -1 S     1000   0:00  |   |       |   \_ php-fpm: pool test
...
...
...

 

У цієї команди багато різних опцій, тому якщо ви активно користуєтеся, то рекомендую ознайомитися з документацією. Найчастіше досить просто знати «ps aux».


kill - Надіслати сигнал процесу. За замовчуванням надсилається сигнал SIGTERM, який завершує процес.

[user@testhost ~]$ ps ux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
531      1027147  0.0  0.0 119956  4260 ?        S    14:51   0:00 sshd: user@pts/1
531      1027149  0.0  0.0 115408  3396 pts/1    Ss   14:51   0:00 -bash
531      1027170  0.0  0.0 119956  4136 ?        R    14:51   0:00 sshd: user@pts/2
531      1027180  0.0  0.0 115408  3564 pts/2    Ss   14:51   0:00 -bash
531      1033727  0.0  0.0 107960   708 pts/1    S+   15:17   0:00 sleep 300
531      1033752  0.0  0.0 117264  2604 pts/2    R+   15:17   0:00 ps ux
[user@testhost ~]$ kill 1033727
[user@testhost ~]$ ps ux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
531      1027147  0.0  0.0 119956  4260 ?        S    14:51   0:00 sshd: user@pts/1
531      1027149  0.0  0.0 115408  3396 pts/1    Ss+  14:51   0:00 -bash
531      1027170  0.0  0.0 119956  4136 ?        R    14:51   0:00 sshd: user@pts/2
531      1027180  0.0  0.0 115408  3564 pts/2    Ss   14:51   0:00 -bash
531      1033808  0.0  0.0 117268  2492 pts/2    R+   15:17   0:00 ps ux

 

Оскільки процес може бути обробником сигналів, kill не завжди призводить до очікуваного результату негайного завершення процесу. Щоб напевно "вбити" процес, вам потрібно надіслати процесу сигнал SIGKILL. Однак це може призвести до втрати даних (наприклад, якщо процес перед завершенням повинен зберегти деяку інформацію на диск), тому вам потрібно скористатися цією командою. Номер сигналу SIGKILL - 9, тому коротка версія команди виглядає так:

[user@testhost ~]$ ps ux | grep sleep
531      1034930  0.0  0.0 107960   636 pts/1    S+   15:21   0:00 sleep 300
531      1034953  0.0  0.0 110516  2104 pts/2    S+   15:21   0:00 grep --color=auto sleep
[user@testhost ~]$ kill -9 1034930
[user@testhost ~]$ ps ux | grep sleep
531      1035004  0.0  0.0 110516  2092 pts/2    S+   15:22   0:00 grep --color=auto sleep

 

Крім згаданих SIGTERM та SIGKILL, існує ще безліч різних сигналів, їх список можна легко знайти в Інтернеті. І не забувайте, що сигнали SIGKILL та SIGSTOP неможливо перехопити чи проігнорувати.

 

ping - Надсилає пакет ECHO_REQUEST хосту ICMP.

[user@testhost ~]$ ping google.com
PING google.com (172.217.15.78) 56(84) bytes of data.
64 bytes from iad23s63-in-f14.1e100.net (172.217.15.78): icmp_seq=1 ttl=47 time=1.85 ms
64 bytes from iad23s63-in-f14.1e100.net (172.217.15.78): icmp_seq=2 ttl=47 time=1.48 ms
64 bytes from iad23s63-in-f14.1e100.net (172.217.15.78): icmp_seq=3 ttl=47 time=1.45 ms
64 bytes from iad23s63-in-f14.1e100.net (172.217.15.78): icmp_seq=4 ttl=47 time=1.46 ms
64 bytes from iad23s63-in-f14.1e100.net (172.217.15.78): icmp_seq=5 ttl=47 time=1.45 ms
^C
--- google.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4006ms
rtt min/avg/max/mdev = 1.453/1.541/1.850/0.156 ms

 

За замовчуванням ping працює доти, доки не буде зупинено вручну. Тому може стати в нагоді опція -c - кількість пакетів, після відправлення яких пінг завершиться сам по собі. Інша опція, яку я іноді використовую, це -i інтервал між відправкою пакетів.

[user@testhost ~]$ ping -c 3 -i 5 google.com
PING google.com (172.217.5.238) 56(84) bytes of data.
64 bytes from iad30s07-in-f238.1e100.net (172.217.5.238): icmp_seq=1 ttl=47 time=1.55 ms
64 bytes from iad30s07-in-f14.1e100.net (172.217.5.238): icmp_seq=2 ttl=47 time=1.17 ms
64 bytes from iad30s07-in-f14.1e100.net (172.217.5.238): icmp_seq=3 ttl=47 time=1.16 ms

--- google.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 10006ms
rtt min/avg/max/mdev = 1.162/1.295/1.551/0.181 ms

 

 

 

Розділ 2: Захист сервера

 

2.1 Оновлення системи

Регулярне оновлення програмного забезпечення вашого сервера має вирішальне значення для безпеки та стабільності. У системі Linux можна використовувати менеджери пакетів, такі як apt або yum, для оновлення системи. Наприклад, щоб оновити систему за допомогою apt, запустіть:

sudo apt update
sudo apt upgrade

 

2.2 Встановлення брандмауера

Брандмауер — життєво важливий захід безпеки, який захищає ваш сервер від несанкціонованого доступу та зловмисної активності. У Linux одним з найпопулярніших рішень для брандмауера є iptables. Для встановлення та налаштування iptables використовуйте такі команди:

sudo apt install iptables
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -j DROP

Наведені вище команди дозволяють вхідні з'єднання SSH (порт 22) і відкидають весь інший вхідний трафік.
Дуже часто разом з ipset використовується Iptables, який дозволяє вказати список IP-адрес, з яких буде дозволено або заборонено доступ до сервера.

Дізнатись більше про IPTABLES

 

2.3 Увімкнення Fail2Ban

Fail2Ban - корисний інструмент для запобігання брутфорсу атак або атак простим перебором, шляхом автоматичного блокування IP-адрес, які неодноразово не проходять аутентифікацію. Щоб встановити Fail2Ban в Ubuntu, запустіть:

sudo apt install fail2ban

Після встановлення налаштувань Fail2Ban за промовчанням має бути достатньо, але ви можете налаштувати його відповідно до своїх потреб.

Дізнатись більше про Fail2ban

 

 

Розділ 3: Налаштування веб-сервера

3.1 Встановлення веб-сервера Apache

Apache - це широко використовуване програмне забезпечення веб-сервера в Linux. Щоб встановити Apache на Ubuntu, запустіть:

sudo apt update
sudo apt install apache2

 

Після встановлення Apache автоматично запуститься, і ви зможете отримати доступ до веб-сторінки за промовчанням, ввівши IP-адресу вашого сервера у веб-браузері.

 

3.2 Налаштування віртуальних хостів

Віртуальні хости дозволяють розміщувати декілька веб-сайтів на одному сервері. Щоб настроїти віртуальний хост, створіть новий конфігураційний файл у каталозі /etc/apache2/sites-available/. Наприклад, щоб створити віртуальний хост для example.com, створіть файл з ім'ям example.com.conf і налаштуйте його відповідним чином. Потім увімкніть віртуальний хост за допомогою команди a2ensite та перезапустіть Apache.

Докладніше про веб-сервер Apache - тут.

 

 

3.3 Встановлення PHP

PHP — це серверна мова сценаріїв, яка зазвичай використовується для динамічного веб-контенту. Щоб встановити PHP в Ubuntu, запустіть:

sudo apt update
sudo apt install php libapache2-mod-php

 

Після встановлення Apache автоматично розпізнає та обробляє файли PHP.

 

 

На цьому оглядова стаття закінчується. Сподіваємося, що вона допоможе вам хоча б почати розбиратися в налаштуванні сервера і надалі ви поглибите свої знання, станете справжнім спеціалістом з адміністрування серверів на Linux і налаштуєте не один сайт для себе чи своїх клієнтів.

Надалі постараємося частіше публікувати такі оглядові статті, а може й заглибимося у тему адміністрування.

June 19, 2023, 2:02 p.m.