Translate

Архив блога

четверг, 24 октября 2013 г.

Настраиваем Syslog сервер на MAC OS X (включая EI Capitan)

По умолчанию syslogd на MacOS X работает, но из сети логи не принимает и соответственно никуда не сохраняет. 
Итак, задача: некоторые устройства, например сетевые маршрутизаторы посылают на сервер т.е. на наш Mac свои логи. Допустим они это делают с  facility: local5 и severity: info. Нам нужно принять эти логи и сохранить их в отдельном файле, например, /var/log/routers.log

Если у Вас уже стоит EI Capitan, то прежде чем читать все нижесказанное нам сначала нужно отключить SIP "System Integrity Protection" - это фитча которая появилась в новой операционке и не позволяет редактировать системные файлы. Делается это так:
- Перезапускаем Mac в режиме Recovery (Нужно держать нажатыми кнопки <Cmd>+<R> пока на экране не появится лого)
- Из системного меню запускаем терминал Utility->Terminal
- вводим команду "csrutil disable"
- снова перезапускаем Mac и теперь мы снова сможем редактировать системные файлы как старых версиях операционок.

Когда у нас все заработает, SIP снова можно будет включить.

Теперь собственно приступаем к настройкам.
Сначала нам нужно научить syslogd создавать сокет и слушать UDP порт 514. Все соответствующие настройки syslogd хранятся в файле:

 /System/Library/LaunchDaemons/com.apple.syslogd.plist

Обычно этот файл находится в бинарном виде и чтобы отредактировать его нужно предварительно конвертировать в XML. Делается это так:

sudo plutil -convert xml1 /System/Library/LaunchDaemons/com.apple.syslogd.plist

Теперь его можно редактировать:

sudo nano /System/Library/LaunchDaemons/com.apple.syslogd.plist

Man по syslogd говрит нам что в этот plist нужно добавить следующие строки в секцию Sockets

 <key>NetworkListener</key>
 <dict>
 <key>SockServiceName</key>
 <string>syslog</string>
 <key>SockType</key>
 <string>dgram</string>
 </dict>

еще для порядка нужно добавить опцию -udp_in в строку запуска демона. Практика показывает что и без этого работает но лучше сделать все по man-у. В итоге этот файл должен выглядеть примерно так:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>EnableTransactions</key>
<true/>
<key>EnvironmentVariables</key>
<dict>
<key>ASL_DISABLE</key>
<string>1</string>
</dict>
<key>HopefullyExitsLast</key>
<true/>
<key>JetsamProperties</key>
<dict>
<key>JetsamMemoryLimit</key>
<integer>300</integer>
<key>JetsamPriority</key>
<integer>-49</integer>
</dict>
<key>Label</key>
<string>com.apple.syslogd</string>
<key>MachServices</key>
<dict>
<key>com.apple.system.logger</key>
<dict>
<key>ResetAtClose</key>
<true/>
</dict>
</dict>
<key>OnDemand</key>
<false/>
<key>POSIXSpawnType</key>
<string>Interactive</string>
<key>ProgramArguments</key>
<array>
<string>/usr/sbin/syslogd</string>
<string>-udp_in</string>
</array>
<key>Sockets</key>
<dict>
<key>NetworkListener</key>
<dict>
<key>SockServiceName</key>
<string>syslog</string>
<key>SockType</key>
<string>dgram</string>
</dict>
<key>BSDSystemLogger</key>
<dict>
<key>SockPathMode</key>
<integer>438</integer>
<key>SockPathName</key>
<string>/var/run/syslog</string>
<key>SockType</key>
<string>dgram</string>
</dict>
</dict>
</dict>
</plist>

Жирным синим я выделил то что мы добавили. Еще раз повторюсь что блок NetworkListener нужно добавлять в блок Sockets.

Получившийся plist нужно конвертировать обратно в бинарный формат.

sudo plutil -convert binary1 /System/Library/LaunchDaemons/com.apple.syslogd.plist

Есть еще один интересный способ редактирования plist с помощью утилиты PlistBuddy. Выглядит он так:

sudo /usr/libexec/PlistBuddy /System/Library/LaunchDaemons/com.apple.syslogd.plist
add :ProgramArguments:1 String -udp_in
add :Sockets:NetworkListener dict
add :Sockets:NetworkListener:SockServiceName string syslog
add :Sockets:NetworkListener:SockType string dgram
save
quit

Здесь как вы видите не нужно ничего никуда конвертировать. Эта утилита работает напрямую с бинарным файлом.

Теперь можно рестартовать демон и проверить что теперь он слушает порт 514

sudo launchctl unload /System/Library/LaunchDaemons/com.apple.syslogd.plist
sudo launchctl load /System/Library/LaunchDaemons/com.apple.syslogd.plist
sudo lsof -i:514
COMMAND  PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
launchd    1 root   89u  IPv4 0x7ea94d2d8fb451ad      0t0  UDP *:syslog
launchd    1 root  106u  IPv6 0x7ea94d2d7c5cc395      0t0  UDP *:syslog
syslogd 4992 root    4u  IPv4 0x7ea94d2d8fb451ad      0t0  UDP *:syslog
syslogd 4992 root    5u  IPv6 0x7ea94d2d7c5cc395      0t0  UDP *:syslog

Теперь приступаем ко второй части задачи. Нам нужно сохранить получаемые логи в файл.
Это процесс в Mac OS, вопреки ожиданиям, управляется не файлом /etc/syslogd.conf а файлом /etc/asl.conf. Первый файл тоже работает но asl представляет больше возможностей. Так как мы в начале договорились что логи приходят как LOCAL5.INFO и должны складываться в файл /var/log/routers.log нам нужно в файл /etc/asl.conf добавить следующую строку 

? [= Facility local5] [= Level info] file /var/log/routers.log mode=0644 format=bsd

и снова рестартовать демон.

sudo launchctl unload /System/Library/LaunchDaemons/com.apple.syslogd.plist
sudo launchctl load /System/Library/LaunchDaemons/com.apple.syslogd.plist

Отныне логи должны складываться в указанный файл.

Комментариев нет:

Отправить комментарий