Налаштування rsyslog для збору логів по мережі через шифроване з'єднання

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

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

В якості піддослідних В нас виступають машинки з CentOS 6.7, тренуватися ми будемо з rsyslog 7.x. rsyslog server (rslserver) у нас буде називатися server.com, а rsyslog client (rslclient) — example.com.

Установка

Ставити rsyslog будемо з їх офіційне репозиторію (http://www.rsyslog.com/rhelcentos-rpms/).

wget http://rpms.adiscon.com/v7-stable/rsyslog.repo -O /etc/yum.repos.d/rsyslog.repo
yum install gnutls-utils rsyslog rsyslog-gnutls
mv /etc/rsyslog.conf.rpmnew /etc/rsyslog.f #у разі якщо що правили до цього, треба буде перенести зміни
service rsyslog restart
less /var/log/messages #перевіряємо що rsyslog запустився без помилок

Клієнт
wget http://rpms.adiscon.com/v7-stable/rsyslog.repo -O /etc/yum.repos.d/rsyslog.repo
yum install rsyslog rsyslog-gnutls #gnutls-utils на клієнті не потрібен
mv /etc/rsyslog.conf.rpmnew /etc/rsyslog.f #у разі якщо що правили до цього, треба буде перенести зміни
service rsyslog restart
less /var/log/messages #перевіряємо що rsyslog запустився без помилок

Налаштування

Генерація сертифікатів
Сама марудна частина. Нам необхідно створити пару ключів CA і за запитом+парі ключів для сервера для кожного клієнта. Всі секьюрно. Для безпеки генерацію варто робити не на сервері/клієнта, а на окремій машині.

CA
Серце нашої безпеки. Генеруємо private key:

[root@sysadmin ~]# certtool --generate-privkey --outfile ca-key.pem
Generating a 2048 bit RSA private key...

Генеруємо самопідписаний сертифікат:

[root@sysadmin ~]# certtool --generate-self-signed --load-privkey ca-key.pem --outfile ca.pem
Generating a self-signed certificate...
Please enter the details of the certificate's distinguished name. Just press enter to ignore a field.
Country name (2 chars): RU
Organization name: myorg
Organizational unit name: 
Locality name: 
State or province name: 
Common name: cacert
UID: 
This field should not be used in new certificates.
E-mail: 
Enter the certificate's serial number in decimal (default: 1395159808): 

Activation/Expiration time.
The certificate will expire in (days): 3650

Extensions.
Does the certificate belong to an authority? (y/N): y
Path length constraint (decimal, -1 for no constraint): 
Is this a TLS web client certificate? (y/N): 
Is this also a TLS web server certificate? (y/N): 
Enter the e-mail of the subject of the certificate: email@admin.com
Will the certificate be used to sign other certificates? (y/N): y
Will the certificate be used to sign CRLs? (y/N): 
Will the certificate be used to sign code? (y/N): 
Will the certificate be used to sign OCSP requests? (y/N): 
Will the certificate be used for time stamping? (y/N): 
Enter the URI of the CRL distribution point: 
X. 509 Certificate Information:
[...]

Is the above information ok? (Y/N): y

Certificate Signing...
[root@sysadmin ~]# ls -l
total 136
-rw------- 1 root root 1675 Mar 18 11:12 ca-key.pem
-rw-r--r-- 1 root root 1318 Mar 18 12:24 ca.pem
[root@sysadmin ~]#

Не забуваємо що з допомогою ca-key.pem зловмисник може запросто замінити сертифікат на свій, тому зберігати його треба в безпечному місці.

Генеруємо private key для rsyslog сервера:

[root@sysadmin ~]# certtool --generate-privkey --outfile rslserver-key.pem --bits 2048
Generating a 2048 bit RSA private key...

Генеруємо certificate request. Rsyslog перевіряє авторизацію по полю сертифіката X509/name, так що в common name краще вказувати FQDN хоста.

[root@sysadmin ~]# certtool --generate-request --load-privkey rslserver-key.pem --outfile request.pem
Generating a PKCS #10 certificate request...
Country name (2 chars): RU
Organization name: myorg
Organizational unit name: 
Locality name: 
State or province name: 
Common name: server.com
UID: 
Enter a dnsName of the subject of the certificate: server.com
Enter a dnsName of the subject of the certificate: 
Enter the IP address of the subject of the certificate: 
Enter the e-mail of the subject of the certificate: 
Enter a challenge password: 
Does the certificate belong to an authority? (y/N): n
Will the certificate be used for signing (DHE and RSA-EXPORT ciphersuites)? (y/N): 
Will the certificate be used for encryption (RSA ciphersuites)? (y/N): 
Is this a TLS web client certificate? (y/N): y
Is this also a TLS web server certificate? (y/N): y

Генеруємо сертифікат з request'а.

[root@sysadmin ~]# certtool --generate-certificate --load-request request.pem --outfile rslserver-cert.pem --load-ca-ca certificate.pem --load-ca-privkey ca-key.pem 
Generating a signed certificate...
Enter the certificate's serial number in decimal (default: 1395162401): 

Activation/Expiration time.
The certificate will expire in (days): 3650

Extensions.
Do you want to honour the extensions from the request? (y/N): 
Does the certificate belong to an authority? (y/N): n
Is this a TLS web client certificate? (y/N): y
Is this also a TLS web server certificate? (y/N): y
Enter a dnsName of the subject of the certificate: server.com
Enter a dnsName of the subject of the certificate: 
Enter the IP address of the subject of the certificate: 
Will the certificate be used for signing (DHE and RSA-EXPORT ciphersuites)? (y/N): 
Will the certificate be used for encryption (RSA ciphersuites)? (y/N): 
X. 509 Certificate Information:
[...]

Is the above information ok? (Y/N): y

Certificate Signing...
[root@sysadmin ~]# rm -f request.pem

Теоретично, можна використовувати wildcards у common name і dns name, генеруючи один сертифікат відразу для кількох хостів, але краще цього не робити. Після генерації сертифіката request можна видалити.

Клієнт
Для клієнта всі кроки ті ж, що і для сервера: генеруємо ключ, потім запит, потім сертифікат. Природно, імена файлів потрібно замінити rslserver на rslclient, а common name/dns name — з server.com на example.com.

Копіюємо файли
Пакет для CentOS створює директорію /etc/pki/rsyslog/, якої гріх не скористатися. Копіюємо на сервер файли ca.pem, rslserver-cert.pem, rslserver-key.pem, а на клієнта файли ca.pem, rslclient-cert.pem, rslclient-key.pem.

Отримуємо щось на зразок:

[root@server.com]# ls -l1 /etc/pki/rsyslog/
-rw-r--r-- 1 root root 1172 Feb 8 20:19 ca.pem
-rw-r--r-- 1 root root 1294 Feb 8 21:13 rslserver-cert.pem
-rw-r--r-- 1 root root 1675 Feb 8 21:11 rslserver-key.pem

[root@example.com]# ls -l1 /etc/pki/rsyslog/
-rw-r--r-- 1 root root 1172 Feb 8 20:21 ca.pem
-rw-r--r-- 1 root root 1273 Feb 8 20:21 rslclient-cert.pem
-rw------- 1 root root 1675 Feb 8 20:21 rslclient-key.pem

Конфіги
Додаємо в початок /etc/rsyslog.conf, відразу після завантаження модулів imuxsock і imklog:

################### REMOTE LOGGING BEGIN #########################
# Increase the amount of open files rsyslog is allowed, which includes open tcp sockets
# This is important if there are many clients.
# http://www.rsyslog.com/doc/rsconf1_maxopenfiles.html
$MaxOpenFiles 2048

# make gtls driver the default
$DefaultNetstreamDriver gtls

# certificate files generated on RHEL6 and stored in /root
$DefaultNetstreamDriverCAFile /etc/pki/rsyslog/ca.pem
$DefaultNetstreamDriverCertFile /etc/pki/rsyslog/rslserver-cert.pem
$DefaultNetstreamDriverKeyFile /etc/pki/rsyslog/rslserver-key.pem

# Provides TCP syslog reception
# parameters for see http://www.rsyslog.com/doc/imtcp.html
module(load="imtcp"
MaxSessions="2000"
StreamDriver.mode="1"
StreamDriver.authmode="x509/name"
PermittedPeer="example.com"
)
input(type="imtcp" port="10514" name="tcp-tls")
################### REMOTE LOGGING END #########################

З назв директив начебто все зрозуміло: якщо ліміт відкритих файлів, вказуємо що потік йде через TLS, показуємо на ключі для його розшифровки, а потім передаємо потік в модуль imtcp, який перевіряє авторизацію по полю x509/name, порівнюючи з дозволеним бенкетом.

Якщо ми хочемо складати логи з кожного клієнта в окремий файл, то в кінці /etc/rsyslog.conf (або в якомусь з файлів /etc/rsyslog.d) нам треба вказати rsyslog відповідні параметри:

# This one is the template to generate the log filename dynamically, depending on the client's hostname.
$template FileForRemote,"/var/log/remote/%fromhost%/syslog.log"

if ($inputname contains "tcp-tls") then 
{
?FileForRemote
stop
}

Тут все просто. Спочатку ми задаємо динамічний шаблон імені файлу, і потім записуємо в ці файли все, що приходить з «tcp-tls» (ім'я вказано вище в input). Після того як ми створили запис, ми припиняємо обробку даного повідомлення (директива stop), щоб вона не потрапила в «загальний котел».

Клієнт
На клієнті все ще простіше. У файлі /etc/rsyslog.d/tls.conf вказуємо, що мережевий потік треба гнати через TLS з такими сертифікатами, перевіряючи x509/name на відповідність заданим. Останній рядок вказує, що в мережі через протокол TCP (@@) на адресу server.com ми шолом тільки записи від ядра (kern).

# make gtls driver the default
$DefaultNetstreamDriver gtls

# certificate files
$DefaultNetstreamDriverCAFile /etc/pki/rsyslog/ca.pem
$DefaultNetstreamDriverCertFile /etc/pki/rsyslog/rslreverb-cert.pem
$DefaultNetstreamDriverKeyFile /etc/pki/rsyslog/rslreverb-key.pem

#### GLOBAL DIRECTIVES ####

# Use default format timestamp
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

# gtls Network Stream Driver
# x509/name - certificate and validation subject name authentication 
# http://www.rsyslog.com/doc/ns_gtls.html
$ActionSendStreamDriverAuthMode x509/name
$ActionSendStreamDriverPermittedPeer server.com
$ActionSendStreamDriverMode 1 # run driver in TLS-only mode

kern.* @@server.com:10514

Власне і все. Не забудьте відкрити порти на фаєрволі і перезапустити rsyslog на сервері і клієнті. У підготовці посібника використовувалась офіційна документація rsyslog і запис блогу Kristian Reese.

Джерело: Хабрахабр

0 коментарів

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