- Вступ
- Серія Linux Administration
- Systemd та системні цілі
- Управління сервісами за допомогою Systemd
- Конфігурація SSH сервера
- Автентифікація SSH на основі ключів
- Конфігурація веб-сервера Apache
- Конфігурація SSL для Apache
- Контроль доступу в Apache
- Конфігурація MySQL/MariaDB
- Синхронізація часу за допомогою Chrony
- Віддалене логування за допомогою Rsyslog
- Найкращі практики для production середовищ
- Усунення поширених проблем
- Висновок
- Часті запитання
Вступ
Конфігурація сервісів є невід'ємною частиною адміністрування систем Linux. Цей всеосяжний посібник охоплює управління сервісами systemd, конфігурацію SSH з автентифікацією на основі ключів, налаштування веб-сервера Apache з SSL, конфігурацію бази даних MySQL, синхронізацію часу NTP та віддалене логування за допомогою rsyslog.
Ми розглянемо цілі systemd (рівні запуску), залежності сервісів, захист SSH, віртуальні хости Apache, безпеку MySQL та централізоване логування. Кожен розділ містить практичні конфігурації та найкращі практики для production середовищ.
Серія Linux Administration
📚 Переглянути повний посібник Linux Administration - Опануйте всі 7 частин з нашим комплексним шляхом навчання.
Це Частина IV нашого комплексного 7-частинного посібника з адміністрування Linux:
- ← Частина I: Файлова система та управління процесами
- Частина II: Аутентифікація користувачів та LDAP
- Частина III: Фаєрвол UFW та мережі
- Частина IV: systemd та SSH Hardening ← Ви тут
- Частина V: Поштовий сервер Postfix →
- Частина VI: Віртуалізація QEMU KVM
- Частина VII: Сховище LVM та RAID
Systemd та системні цілі
Архітектура Systemd
Системні цілі (рівні запуску):
| Ціль | Застарілий рівень запуску | Опис |
|---|---|---|
| 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
Життєвий цикл сервісу
Команди для управління сервісами:
# 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 сервера:
# 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 ключів
Налаштування 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:
# 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
Генерація самопідписаного сертифіката (для розробки):
# 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:
# 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 сервера (отримує логи):
# 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 середовищ
-
Безпека SSH:
- Вимкніть вхід від імені root
- Використовуйте тільки автентифікацію на основі ключів
- Змініть порт за замовчуванням (безпека через невідомість)
- Впровадьте fail2ban для захисту від brute-force атак
- Використовуйте SSH центри сертифікації для великих розгортань
-
Apache/Веб-сервер:
- Завжди використовуйте HTTPS з дійсними сертифікатами (Let's Encrypt)
- Вимкніть виведення списку директорій
- Встановіть правильні дозволи для файлів (644 для файлів, 755 для директорій)
- Увімкніть заголовки безпеки (HSTS, CSP, X-Frame-Options)
- Регулярні оновлення безпеки
-
MySQL/База даних:
- Ніколи не використовуйте обліковий запис root для додатків
- Використовуйте принцип найменших привілеїв
- Увімкніть SSL для віддалених з'єднань
- Регулярні резервні копії з mysqldump
- Моніторинг повільних запитів
-
Управління сервісами:
- Використовуйте systemd для всіх сервісів
- Увімкніть автозапуск сервісів при завантаженні
- Моніторте стан сервісів за допомогою інструментів моніторингу
- Впровадьте перевірки стану здоров'я
- Централізуйте логування
-
Синхронізація часу:
- Завжди синхронізуйте час на всіх серверах
- Використовуйте локальний 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 стеком для розширеної аналітики та візуалізації.