Цілі systemd Linux та налаштування захисту SSH сервера

Конфігурація сервісів Linux: SSH, Apache, MySQL та системні сервіси

Вступ

Конфігурація сервісів є невід'ємною частиною адміністрування систем Linux. Цей всеосяжний посібник охоплює управління сервісами systemd, конфігурацію SSH з автентифікацією на основі ключів, налаштування веб-сервера Apache з SSL, конфігурацію бази даних MySQL, синхронізацію часу NTP та віддалене логування за допомогою rsyslog.

Ми розглянемо цілі systemd (рівні запуску), залежності сервісів, захист SSH, віртуальні хости Apache, безпеку MySQL та централізоване логування. Кожен розділ містить практичні конфігурації та найкращі практики для production середовищ.

Серія Linux Administration

📚 Переглянути повний посібник Linux Administration - Опануйте всі 7 частин з нашим комплексним шляхом навчання.

Це Частина IV нашого комплексного 7-частинного посібника з адміністрування Linux:

  1. ← Частина I: Файлова система та управління процесами
  2. Частина II: Аутентифікація користувачів та LDAP
  3. Частина III: Фаєрвол UFW та мережі
  4. Частина IV: systemd та SSH Hardening ← Ви тут
  5. Частина V: Поштовий сервер Postfix
  6. Частина VI: Віртуалізація QEMU KVM
  7. Частина VII: Сховище LVM та RAID

Systemd та системні цілі

Архітектура Systemd

   System Targets   

   Systemd Init System   

  System Boot  

  PID 1  

  systemd  

  Targets  

  Runlevels  

  rescue.target  

  Single user  

  multi-user.target  

  CLI mode  

  graphical.target  

  GUI mode  

  System Services  

  nginx, mysql, ssh  

Системні цілі (рівні запуску):

Ціль Застарілий рівень запуску Опис
poweroff.target 0 Вимкнення системи
rescue.target 1 Однокористувацький режим (відновлення)
multi-user.target 2, 3, 4 Багатокористувацький, тільки CLI
graphical.target 5 Багатокористувацький з GUI
reboot.target 6 Перезавантаження системи

Управління цілями:

# Check current target (документація systemd: https://www.freedesktop.org/software/systemd/man/systemd.target.html)
systemctl get-default

# List all targets
systemctl list-units --type=target

# List available targets
systemctl list-unit-files --type=target

# Switch to different target (temporary)
sudo systemctl isolate rescue.target
sudo systemctl isolate multi-user.target
sudo systemctl isolate graphical.target

# Set default target (permanent)
sudo systemctl set-default multi-user.target
sudo systemctl set-default graphical.target

# Check target dependencies
systemctl list-dependencies graphical.target

# Show target configuration
systemctl cat multi-user.target

Управління сервісами за допомогою Systemd

Життєвий цикл сервісу

   start   

   stop   

   failure   

   start   

   restart   

  Inactive  

  Active Running  

  Failed  

  Stopped  

Команди для управління сервісами:

# Service status
systemctl status nginx
systemctl status nginx.service

# Start/stop service
sudo systemctl start nginx
sudo systemctl stop nginx

# Restart service
sudo systemctl restart nginx

# Reload configuration (no restart)
sudo systemctl reload nginx

# Enable/disable service (autostart on boot)
sudo systemctl enable nginx
sudo systemctl disable nginx

# Check if service is enabled
systemctl is-enabled nginx

# Check if service is active
systemctl is-active nginx

# List all services
systemctl list-units --type=service
systemctl list-units --type=service --state=running
systemctl list-units --type=service --state=failed

# View service logs
journalctl -u nginx
journalctl -u nginx -f  # follow logs
journalctl -u nginx --since today
journalctl -u nginx --since "2025-01-01"

Конфігурація SSH сервера

Архітектура SSH

   SSH Server   

  SSH Client  

  ssh, scp, sftp  

  sshd daemon  

  Port 22  

  /etc/ssh/sshd_config  

  ~/.ssh/authorized_keys  

  Authentication  

  Password or Key  

  User Shell  

Встановлення та налаштування SSH сервера:

# Install OpenSSH server (документація OpenSSH: https://www.openssh.com/manual.html)
sudo apt install openssh-server

# Check SSH service status
systemctl status sshd
systemctl status ssh  # Debian/Ubuntu

# Main configuration file
sudo vim /etc/ssh/sshd_config

# Key configuration options:
Port 22                          # Default SSH port
PermitRootLogin no              # Disable root login
PubkeyAuthentication yes        # Enable key-based auth
PasswordAuthentication yes      # Allow password auth
PermitEmptyPasswords no         # Deny empty passwords
X11Forwarding no                # Disable X11 forwarding
MaxAuthTries 3                  # Max authentication attempts
ClientAliveInterval 300         # Keep-alive interval
ClientAliveCountMax 2           # Max keep-alive messages

# Restart SSH after changes
sudo systemctl restart sshd

Контроль доступу:

# Allow specific users only
AllowUsers john alice admin

# Deny specific users
DenyUsers baduser hacker

# Allow specific groups
AllowGroups sshusers admins

# Deny specific groups
DenyGroups noremote guests

# Restrict by IP (using Match block)
Match Address 192.168.1.0/24
    PasswordAuthentication yes
Match Address *,!192.168.1.0/24
    PasswordAuthentication no

Автентифікація SSH на основі ключів

Архітектура SSH ключів

   Server   

   Client   

   sign challenge   

   verify signature   

  Private Key  

  ~/.ssh/id_rsa  

  Public Key  

  authorized_keys  

  Authentication  

  Successful Login  

Налаштування SSH ключів:

# Generate SSH key pair (client)
ssh-keygen -t rsa -b 4096 -C "user@example.com"
# OR modern Ed25519 (recommended)
ssh-keygen -t ed25519 -C "user@example.com"

# Key locations:
# Private: ~/.ssh/id_rsa (or id_ed25519)
# Public: ~/.ssh/id_rsa.pub (or id_ed25519.pub)

# Copy public key to server (automated)
ssh-copy-id user@server.com

# Manual method: copy public key content
cat ~/.ssh/id_rsa.pub
# Then on server:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "PUBLIC_KEY_CONTENT" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

# Test key-based login
ssh user@server.com

# Use specific key
ssh -i ~/.ssh/custom_key user@server.com

Конфігурація SSH клієнта (~/.ssh/config):

# Create client config
vim ~/.ssh/config

# Example configuration:
Host myserver
    HostName 192.168.1.100
    Port 22
    User john
    IdentityFile ~/.ssh/id_rsa
    ServerAliveInterval 60

Host github
    HostName github.com
    User git
    IdentityFile ~/.ssh/github_key

Host *.example.com
    User admin
    Port 2222

# Now simply use:
ssh myserver

Вимкнення автентифікації за паролем (після налаштування ключів):

# Edit SSH config
sudo vim /etc/ssh/sshd_config

# Set these values:
PasswordAuthentication no
PubkeyAuthentication yes
ChallengeResponseAuthentication no

# Restart SSH
sudo systemctl restart sshd

Конфігурація веб-сервера Apache

Архітектура Apache

   Apache HTTP Server   

  HTTP Client  

  Browser  

  apache2.conf  

  Main config  

  Modules  

  SSL, Rewrite  

  Virtual Hosts  

  sites-enabled  

  /var/www/html  

  Web content  

Встановлення Apache:

# Install Apache (документація Apache: https://httpd.apache.org/docs/2.4/)
sudo apt install apache2

# Check status
systemctl status apache2

# Main configuration
sudo vim /etc/apache2/apache2.conf

# Test configuration
sudo apache2ctl configtest

# Restart Apache
sudo systemctl restart apache2

Управління модулями Apache:

# List available modules
ls /etc/apache2/mods-available/

# List enabled modules
ls /etc/apache2/mods-enabled/
apache2ctl -M

# Enable module
sudo a2enmod rewrite
sudo a2enmod ssl
sudo a2enmod headers

# Disable module
sudo a2dismod status

# Restart after module changes
sudo systemctl restart apache2

Віртуальні хости:

# Create virtual host config
sudo vim /etc/apache2/sites-available/example.com.conf

# Example virtual host:
<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    ServerAdmin admin@example.com

    DocumentRoot /var/www/example.com

    <Directory /var/www/example.com>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/example.com-error.log
    CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined
</VirtualHost>

# Create document root
sudo mkdir -p /var/www/example.com
sudo chown -R www-data:www-data /var/www/example.com

# Enable site
sudo a2ensite example.com.conf

# Disable site
sudo a2dissite 000-default.conf

# Reload Apache
sudo systemctl reload apache2

Конфігурація SSL для Apache

Архітектура SSL/TLS

   SSL/TLS   

   HTTPS request   

  Client  

  Browser  

  SSL Certificate  

  *.crt  

  Private Key  

  *.key  

  Apache SSL  

  Port 443  

  Encrypted Traffic  

  HTTPS  

Генерація самопідписаного сертифіката (для розробки):

# Generate SSL certificate (документація OpenSSL: https://www.openssl.org/docs/man1.1.1/man1/openssl.html)
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout /etc/ssl/private/apache-selfsigned.key \
  -out /etc/ssl/certs/apache-selfsigned.crt

# Answer prompts:
# Country Name: US
# State: New York
# Locality: New York City
# Organization: My Company
# Common Name: example.com

Налаштування Apache SSL:

# Enable SSL module
sudo a2enmod ssl

# Create SSL virtual host
sudo vim /etc/apache2/sites-available/example.com-ssl.conf

# SSL Virtual Host:
<VirtualHost *:443>
    ServerName example.com
    ServerAlias www.example.com

    DocumentRoot /var/www/example.com

    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
    SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key

    # Modern SSL configuration
    SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
    SSLCipherSuite HIGH:!aNULL:!MD5
    SSLHonorCipherOrder on

    <Directory /var/www/example.com>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/example.com-ssl-error.log
    CustomLog ${APACHE_LOG_DIR}/example.com-ssl-access.log combined
</VirtualHost>

# Enable SSL site
sudo a2ensite example.com-ssl.conf

# Restart Apache
sudo systemctl restart apache2

Перенаправлення з HTTP на HTTPS:

# Add to port 80 virtual host:
<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com

    Redirect permanent / https://example.com/
</VirtualHost>

Контроль доступу в Apache

Контроль доступу на основі хостів:

# Allow from specific IP/network
<Directory /var/www/html/admin>
    Require ip 192.168.1.0/24
    Require ip 10.0.0.100
</Directory>

# Deny from specific IP
<Directory /var/www/html>
    <RequireAll>
        Require all granted
        Require not ip 192.168.1.50
    </RequireAll>
</Directory>

# Allow from hostname
<Directory /var/www/html>
    Require host example.com
    Require host .example.com
</Directory>

Конфігурація MySQL/MariaDB

Архітектура MySQL

   MySQL Server   

  MySQL Client  

  mysql, mysqldump  

  mysqld  

  Port 3306  

  /etc/mysql/my.cnf  

  User Accounts  

  /var/lib/mysql  

  Data directory  

Встановлення та захист MySQL:

# Install MySQL server (документація MySQL: https://dev.mysql.com/doc/refman/8.0/en/)
sudo apt install mysql-server

# Check status
systemctl status mysql

# Secure installation
sudo mysql_secure_installation

# Prompts:
# - Set root password: Yes
# - Remove anonymous users: Yes
# - Disallow root login remotely: Yes
# - Remove test database: Yes
# - Reload privilege tables: Yes

Управління користувачами MySQL:

# Connect to MySQL as root
sudo mysql -u root -p

# Create database
CREATE DATABASE myapp;

# Create user (local only)
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'StrongPassword123!';

# Create user (remote access)
CREATE USER 'appuser'@'192.168.1.%' IDENTIFIED BY 'StrongPassword123!';

# Grant privileges
GRANT ALL PRIVILEGES ON myapp.* TO 'appuser'@'localhost';
GRANT SELECT, INSERT, UPDATE ON myapp.* TO 'readonly'@'%';

# Apply changes
FLUSH PRIVILEGES;

# Show grants
SHOW GRANTS FOR 'appuser'@'localhost';

# Remove user
DROP USER 'appuser'@'localhost';

# Change password
ALTER USER 'appuser'@'localhost' IDENTIFIED BY 'NewPassword456!';

Конфігурація MySQL:

# Main config file
sudo vim /etc/mysql/my.cnf
# OR
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

# Key settings:
[mysqld]
bind-address = 127.0.0.1        # Listen on localhost only
# bind-address = 0.0.0.0         # Listen on all interfaces

port = 3306                      # Default port

max_connections = 150            # Max concurrent connections
max_allowed_packet = 64M         # Max packet size

# Performance tuning
innodb_buffer_pool_size = 1G     # InnoDB cache (set to 70% of RAM)
innodb_log_file_size = 256M      # Transaction log size

# Logging
log_error = /var/log/mysql/error.log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2              # Log queries > 2 seconds

# Restart after changes
sudo systemctl restart mysql

Синхронізація часу за допомогою Chrony

Конфігурація NTP клієнта

# Install chrony
sudo apt install chrony

# Configuration file
sudo vim /etc/chrony/chrony.conf

# Configuration:
# Use public NTP pool
pool pool.ntp.org iburst

# Or specific servers
server time.google.com iburst
server time.cloudflare.com iburst

# Allow local network to use this as NTP server
allow 192.168.1.0/24

# Restart chrony
sudo systemctl restart chrony

# Check synchronization status
chronyc tracking
chronyc sources -v

# Force synchronization
sudo chronyc makestep

# System time management
timedatectl
sudo timedatectl set-timezone America/New_York

# List timezones
timedatectl list-timezones | grep New_York

Віддалене логування за допомогою Rsyslog

Архітектура Rsyslog

   Rsyslog Server   

   Log Clients   

   send logs   

   send logs   

  Web Server  

  DB Server  

  rsyslogd  

  Port 514  

  /etc/rsyslog.conf  

  /var/log/remote  

  Centralized logs  

Налаштування rsyslog сервера (отримує логи):

# Edit rsyslog configuration
sudo vim /etc/rsyslog.conf

# Enable UDP reception (port 514)
module(load="imudp")
input(type="imudp" port="514")

# Enable TCP reception (more reliable)
module(load="imtcp")
input(type="imtcp" port="514")

# Store remote logs by hostname
$template RemoteLogs,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs
& stop

# Create log directory
sudo mkdir -p /var/log/remote

# Open firewall
sudo ufw allow 514/udp
sudo ufw allow 514/tcp

# Restart rsyslog
sudo systemctl restart rsyslog

Налаштування rsyslog клієнта (надсилає логи):

# Edit rsyslog configuration
sudo vim /etc/rsyslog.conf

# Send all logs to remote server (UDP)
*.* @192.168.1.100:514

# Send all logs to remote server (TCP, more reliable)
*.* @@192.168.1.100:514

# Send specific facility/priority
auth,authpriv.* @@192.168.1.100:514
*.err @@192.168.1.100:514

# Restart rsyslog
sudo systemctl restart rsyslog

# Test logging
logger -t test "Test message from client"

Найкращі практики для production середовищ

  1. Безпека SSH:

    • Вимкніть вхід від імені root
    • Використовуйте тільки автентифікацію на основі ключів
    • Змініть порт за замовчуванням (безпека через невідомість)
    • Впровадьте fail2ban для захисту від brute-force атак
    • Використовуйте SSH центри сертифікації для великих розгортань
  2. Apache/Веб-сервер:

    • Завжди використовуйте HTTPS з дійсними сертифікатами (Let's Encrypt)
    • Вимкніть виведення списку директорій
    • Встановіть правильні дозволи для файлів (644 для файлів, 755 для директорій)
    • Увімкніть заголовки безпеки (HSTS, CSP, X-Frame-Options)
    • Регулярні оновлення безпеки
  3. MySQL/База даних:

    • Ніколи не використовуйте обліковий запис root для додатків
    • Використовуйте принцип найменших привілеїв
    • Увімкніть SSL для віддалених з'єднань
    • Регулярні резервні копії з mysqldump
    • Моніторинг повільних запитів
  4. Управління сервісами:

    • Використовуйте systemd для всіх сервісів
    • Увімкніть автозапуск сервісів при завантаженні
    • Моніторте стан сервісів за допомогою інструментів моніторингу
    • Впровадьте перевірки стану здоров'я
    • Централізуйте логування
  5. Синхронізація часу:

    • Завжди синхронізуйте час на всіх серверах
    • Використовуйте локальний NTP сервер для внутрішніх мереж
    • Моніторте розбіжність часу

Усунення поширених проблем

З'єднання SSH відхилено:

# Check if SSH is running
systemctl status sshd

# Check SSH port
ss -tlnp | grep sshd

# Check firewall
sudo ufw status | grep 22

# Check logs
sudo tail -f /var/log/auth.log

Apache не запускається:

# Check configuration
sudo apache2ctl configtest

# Check error logs
sudo tail -f /var/log/apache2/error.log

# Check if port is already in use
sudo ss -tlnp | grep :80

Доступ до MySQL заборонено:

# Reset root password (if forgotten)
sudo systemctl stop mysql
sudo mysqld_safe --skip-grant-tables &
mysql -u root
UPDATE mysql.user SET authentication_string=PASSWORD('newpass') WHERE User='root';
FLUSH PRIVILEGES;
exit
sudo systemctl restart mysql

Висновок

Конфігурація сервісів Linux охоплює управління systemd, безпеку SSH, веб-сервери, бази даних та логування. Розуміння системних цілей, автентифікації SSH на основі ключів, віртуальних хостів Apache, управління користувачами MySQL та централізованого логування є критично важливим для production систем.

Обирайте відповідні конфігурації: systemd для управління сервісами, SSH на основі ключів для безпеки, віртуальні хости Apache для декількох сайтів, MySQL з найменшими привілеями та rsyslog для централізованого логування. Впроваджуйте найкращі практики безпеки, моніторте сервіси та підтримуйте вичерпну документацію.


Часті запитання

П: Що таке systemd і як це працює?

Systemd - це сучасна система ініціалізації Linux, що керує сервісами, процесами та запуском системи. Використовує unit файли для визначення сервісів, targets для групування та управління залежностями для впорядкованого запуску. Команди як "systemctl start/stop/enable service" контролюють сервіси. Systemd замінив SysVinit, пропонуючи паралельний запуск, активацію на вимогу та кращу інтеграцію логування.

П: Як створити systemd сервіс?

Створіть unit файл у /etc/systemd/system/myservice.service з секціями [Unit], [Service] та [Install]. Визначте ExecStart для команди, Type для поведінки сервісу (simple, forking, oneshot) та WantedBy для залежностей. Виконайте "systemctl daemon-reload" для завантаження, "systemctl enable" для запуску при завантаженні та "systemctl start" для запуску.

П: Що таке автентифікація SSH за ключем і навіщо використовувати?

Автентифікація SSH за ключем використовує пари відкритий-приватний ключ замість паролів для безпечного автоматизованого входу. Генеруйте ключі через "ssh-keygen", копіюйте публічний ключ на сервер через "ssh-copy-id". Переваги включають сильнішу безпеку, відсутність передачі паролів та автоматизовані розгортання. Вимкніть автентифікацію паролем у /etc/ssh/sshd_config для максимальної безпеки.

П: Як працюють віртуальні хости Apache?

Віртуальні хости Apache дозволяють розміщувати декілька веб-сайтів на одному сервері, використовуючи різні домени або IP. Name-based віртуальні хости використовують директиву ServerName для зіставлення імен хостів. Налаштовуйте в /etc/apache2/sites-available/, увімкніть через "a2ensite" та перезавантажте Apache. Кожен віртуальний хост має окремі DocumentRoot, логи та конфігурацію.

П: Як захистити базу даних MySQL?

Захистіть MySQL, виконавши "mysql_secure_installation" для видалення анонімних користувачів, вимкнення віддаленого root та видалення тестових баз даних. Створюйте користувачів з конкретними привілеями: "GRANT SELECT ON db.* TO 'user'@'localhost'". Використовуйте надійні паролі, прив'язуйте тільки до localhost, увімкніть SSL та регулярно оновлюйте. Моніторте логи на спроби несанкціонованого доступу.

П: Яка різниця між командами systemctl та service?

Systemctl - це нативна команда systemd з повним контролем: "systemctl start nginx". Service - це обгортка сумісності, що підтримує systemd та SysVinit: "service nginx start". Systemctl пропонує більше функцій, як enable/disable, list-dependencies та show. Використовуйте systemctl на сучасних системах для повної функціональності.

П: Як працює централізоване логування rsyslog?

Rsyslog збирає логи з кількох серверів на центральний сервер. Налаштуйте клієнти для пересилання логів через ". @@logserver:514" у /etc/rsyslog.conf. Сервер приймає через модулі вводу imudp або imtcp. Переваги включають централізований пошук, утримання, аналіз безпеки та відповідність вимогам. Використовуйте з ELK стеком для розширеної аналітики та візуалізації.