Перші 10 хвилин на сервері

Азбука безпеки Ubuntu
«Мої перші 5 хвилин на сервері» Брайана Кеннеді — відмінне введення, як швидко захистити сервер від більшості атак. У нас є кілька в цю інструкцію, щоб доповнити нею наше повне керівництво. Також хочеться детальніше пояснити деякі речі для більш юних інженерів.

Щоранку я перевіряю поштові повідомлення logwatch і отримую грунтовне задоволення, спостерігаючи кілька сотень (іноді тисяч) безуспішних спроб отримати доступ. (Багато досить прозаїчні — спроби авторизуватися
root
з паролем
1234
знову і знову). Наведена тут загальна методика підходить для серверів Debian/Ubuntu, які особисто ми вважаємо за краще всім іншим. Вони зазвичай служать тільки хостами для контейнерів Docker, але принципи ті самі.

На великих масштабах краще використовувати повністю автоматичні установки з інструментами на зразок Ansible або Shipyard, але іноді ви просто піднімаєте єдиний сервер або підбираєте завдання для Ansible — для таких ситуацій призначена інструкція.

Примітка: Ця довідка створена як базова абетка. Її слід розширити та доповнити у відповідності з вашими потребами.

У першу чергу
У нас ще навіть немає пароль рута. Хотілося б вибрати що-небудь випадкове і складне. Використовуємо генератор менеджера паролів з налаштуваннями максимальної складності. Менеджер паролів зберігає пароль і шифрує його, доступ до нього можливий тільки по довгому майстер-паролем. Тут передбачена пара надлишкових заходів захисту (довгий, складний випадковий пароль + захист пароля шифруванням і іншим довгим паролем). Чи використовуєте ви парольний менеджер або інші інструменти, зберігайте пароль, застосовуючи яку-небудь форму шифрування. Вам знадобиться тільки цей рутовий пароль в разі втрати пароля sudo.

# passwd


*Примітка: HN і Reddit розгорнулася цікава дискусія про рутових паролі. Її варто почитати.

Тепер слід оновити репозиторії і накотити останні патчі. Далі буде окремий розділ по автоматизації установки оновлень безпеки.

apt-get update
 
apt-get upgrade


Додаємо користувача
Вам ніколи не слід заходити на сервер як рут. Ми слідуємо тим же правилам при створенні користувачів, які встановив Брайан Кеннеді, але ви можете використовувати власні. У нашої маленької команди не було проблем з використанням єдиного користувача для авторизації, але у великих командах краще створити різних користувачів з різними рівнями привілеїв, де тільки обрані отримують привілеї sudo.

useradd deploy
 
mkdir /home/deploy
 
mkdir /home/deploy/.ssh
 
chmod 700 /home/deploy/.ssh


Встановлюємо предчтительную оболонку для користувача deploy, ми використовуємо bash:

usermod -s /bin/bash deploy


Пам'ятайте:
chmod 700
означає, що власник облікового запису володіє правами на читання, запис і запуск програм. Ми все ще перебуваємо з правами рута, але через хвилину ми запустимо команду
chown
рекурсивно на цій теці користувача deploy і групи deploy. Тільки цей користувач повинен мати право працювати з папкою .ssh.

Автентифікація за допомогою ключа ssh
Ми намагаємося не використовувати паролі для входу на сервер. Щодо цього було багато суперечок після того як вийшла інструкція Брайана, але я теж схильний погодитися з такою позицією. Ось кілька зауважень на цей рахунок:

  1. Ключі ssh краще паролів тільки тому, що вони містять і вимагають більше інформації.

  2. Паролі можна підібрати брутфорсом. Гадати по публічного ключа по суті неможливо, так що їх можна вважати цілком безпечними.

  3. щодо крадіжки комп'ютера? Так, там ваші секретні ключі, але відкликати ssh-key легко, досить просто видалити відкритий ключ з authorized_keys. Вам слід захистити секретний ключ безпечної і довгою парольної фрази. См. наступний пункт.

  4. Все це працює ТІЛЬКИ ЗА УМОВИ БЕЗПЕЧНОЇ І ДОВГОЮ ПАРОЛЬНОЇ ФРАЗИ, що ЗАХИЩАЄ КЛЮЧ. Повторюємо другий раз, тому що це критично важливо.
Отже, залишимо в минулому аутентифікацію по паролю. Скопіюйте вміст id_rsa.pub1 зі своєї локальної машини на сервери в файл authorized_keys.

vim /home/deploy/.ssh/authorized_keys


Встановимо правильні привілеї, керуючись принципом безпеки Linux, відомим як принцип мінімальних привілеїв:

chmod 400 /home/deploy/.ssh/authorized_keys
 
chown deploy:deploy /home/deploy -R


chmod 400
встановлює дозволу, так що файл може прочитати тільки власник. Інша команда
chown
робить користувача deploy і групу deploy власниками (рекурсивно) їх домашньої директорії. Ми згадували про це раніше, коли встановлювали дозвіл на читання, запис і виконання для власника цієї директорії.

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

Тестування користувача deploy і установка sudo
Ми збираємося перевірити, як відбувається авторизація користувача deploy, в той же час зберігаючи відкритим з'єднання ssh для рута на всякий випадок. Якщо все працює нормально, ми використовуємо наше відкрите підключення рута, щоб встановити пароль для deploy. Оскільки ми відключаємо авторизацію по паролю, то цей пароль буде використано при застосуванні sudo. Знову ми запускаємо парольний менеджер для генерації складного і випадкового пароля, зберігаємо його в зашифрованому вигляді і повідомляємо колегам (синхронізація зашифрованого файлу з паролем).

passwd deploy


Установка sudo проста. Відкриваємо файл sudo:

visudo


Додаємо групу
%sudo
під рутовым користувачем, як показано нижче. Переконайтеся, що інші користувачі і групи відбиті коментарями з символом
#
(у користувачів немає префіксів, а групи починаються з
%
). На більшості свіжих установок там нічого немає, але на всяк випадок.

root ALL=(ALL) ALL
 
%sudo ALL=(ALL:ALL) ALL


Тепер додамо користувача
deploy
в групу
sudo
.

usermod -a -G sudo deploy


Це надасть користувачеві deploy доступ до sudo після введення пароля, який ми тільки що створили.

Зауваження до виправлення: спасибі користувачеві ackackacksyn на Reddit за вірне замітки, що не слід додавати користувачів безпосередньо в список sudo.

Активуємо вхід за ключа ssh
Конфігурація ssh для цієї машини зберігається тут:

vim /etc/ssh/sshd_config


Ви захочете додати туди кілька рядків. Мені здається, вони досить зрозумілі самі по собі. Це IP-адреса, який ви використовуєте для підключення. У нас в компанії використовується VPN-конфігурація з OpenVPN і криптографічного аутентифікацією, так що для підключення до сервера потрібно також пройти аутентифікацію та бути підключеним до мережі VPN.

PermitRootLogin no
 
PasswordAuthentication no
 
AllowUsers deploy@(your-VPN-or-static-IP)


Активуйте всі ці правила, перезапустивши служби ssh. Ймовірно, доведеться перепідключитися (робіть це через користувача deploy!).

service ssh restart


Установка файрвола
Зазвичай тут два табори. Одні використовують IPtables безпосередньо, а інші застосовують зручний інтерфейс під назвою
ufw
, який представляє собою шар над IPtables для спрощення процесу установки. Більш простий варіант краще з точки зору безпеки. ufw від DigitalOcean дійсно непоганий і допомагає в основних речах.

ufw
встановлений за замовчуванням на Ubuntu, а на Debian досить запустити команду
apt-get install ufw
.

За замовчуванням
ufw
має відмовляти в усіх вхідних підключень і вирішувати всі вихідні, однак, він не буде запущено (бо інакше як би ви підключилися?). Ми пройдемося і явно дозволимо сполуки, які вважаються нормальними.

По-перше, слід переконатися в підтримку IPv6. Відкрийте конфігураційний файл.

vim /etc/default/ufw


Встановіть IPv6 значення
yes
.

IPV6=yes


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

sudo ufw allow from {your ip} to any port 22
 
sudo ufw allow 80
 
sudo ufw allow 443
 
sudo ufw disable
 
sudo ufw enable


Перше — це надлишкова міра, яка гарантує, що тільки з'єднання з нашого IP-адреси можуть з'єднуватися по SSH (стандартний порт SSH)2. Друга і третя команда відкривають трафік http і https.

Примітка: Спасибі chrisfosterelli за зауваження, що якщо ви збираєтеся встановити перше правило (а вам слід це зробити), то переконайтесь, що у вас статичний IP-адресу або безпечний VPN, до якого ви підключаєтеся. Динамічний IP-адресу залишить вас без доступу до сервера коли-небудь в майбутньому.

Автоматичні оновлення безпеки
Мені вони подобаються. Вони не ідеальні, але це краще, ніж пропустити патчі після їх виходу.

apt-get install unattended-upgrades
 

 
vim /etc/apt/apt.conf.d/10periodic


Оновіть цей файл наступним чином:

APT::Periodic::Update-Package-Lists "1";
 
APT::Periodic::Download-Upgradeable-Packages "1";
 
APT::Periodic::AutocleanInterval "7";
 
APT::Periodic::Unattended-Upgrade "1";


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

vim /etc/apt/apt.conf.d/50unattended-upgrades


Відредагуйте файл наступним чином:

Unattended-Upgrade::Allowed-Origins {
 
"Ubuntu lucid-security";
 
//"Ubuntu lucid-updates";
 
};


Все готово.

Fail2ban


fail2ban — відмінний пакет, який проактивно блокує підозрілу активність, як тільки вона виявлена. В їх вікі сказано, що fail2ban сканує файли логів (наприклад,
/var/log/apache/error_log
) і баніт IP-адреси, які виявляють підозрілі ознаки — занадто багато спроб введення неправильного пароля, пошук експлойтів та ін… Відразу після установки Fail2Ban оснащений фільтрами для різних сервісів (apache, courier, ssh та ін).

apt-get install fail2ban


Двофакторна аутентифікація
Двофакторна аутентифікація обов'язкова, якщо ми проектуємо систему, яка відповідає нормам безпеки. Теоретично, якщо ви активуєте двофакторну аутентифікацію поверх всіх інших захисних заходів, то тоді для отримання доступу до сервера (через розтин вразливостей в додатках), нападником доведеться мати:

  1. Доступ до вашого сертифіката та ключа для доступу до VPN.
  2. Доступ до вашого комп'ютера, щоб отримати секретний ключ.
  3. Доступ до вашої парольної фрази для секретного ключа.
  4. Доступ до вашого телефону для двофакторної аутентифікації.
Це чимало бар'єрів (чотири), які доведеться подолати. Навіть якщо вони отримають рутовий доступ через sudo, їм доведеться знайти пароль deploy, який захищений шифруванням AES (п'ятий бар'єр).

Встановлюємо пакет.

apt-get install libpam-google-кодів


Для установки запускаємо команду і слідуємо інструкціям:

su deploy
 
google-кодів


Двофакторна аутентифікація встановлюється дуже легко і додає хороший додатковий рівень безпеки.

Logwatch
Цей інструмент швидше для задоволення та моніторингу постфактум. Logwatch відстежує логи і у відповідності з налаштуваннями надсилає поштою щоденну красиво структуровану зведення. Це досить цікаві дані, і ви здивуєтеся, як багато спроб доступу до сервера відбувається кожен день. Я встановив його тільки для того, щоб продемонструвати колегам, наскільки важливо мати хорошу безпеку.

У DigitalOcean є відмінне опис установки і налаштування Logwatch, але якщо ми хочемо вкластися в 10 хвилин, то просто встановимо його і зробимо завдання cron для щоденного завантаження і відправки листа по електронній пошті.

apt-get install logwatch


Додаємо завдання cron.

vim /etc/cron.daily/00logwatch


Додайте такий рядок у файл cron:

/usr/sbin/logwatch --output mail --mailto you@example.com --detail high


Все готово
Ну ось. Після завершення всього вищепереліченого вашою основною турботою і точкою збою стане ваш додаток і сервіси. Це зовсім інша сфера.

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



1 Переконайтеся, що вказаний саме `.pub`. Це здається дуже простим, але я зустрічав двох товаришів (обидва *не* працюють в нашій компанії — вони б швидко припинили тут працювати) за свою кар'єру, які прислали мені свої секретні ключі (`id_rsa` без розширення .pub), коли я попросив надіслати відкритий ключ. Повернутися до статті

2 Думки розходяться, призначати для SSH з'єднань стандартний чи нестандартний порт. См. здесь і здесь аргументи обох сторін. Повернутися до статті
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.