Оролтууд (Inputs) — 6-р хэсэг: GELF
Энэ хуудсыг AI-аар орчуулж, автоматаар шалгасан. Нарийн тохиргоо хийхээсээ өмнө англи эхтэй тулгаж болно.
GELF
Security Data Lake Extended Log Format (GELF) нь сонгодог энгийн syslog-ийн дараах дутагдлаас зайлсхийсэн лог формат юм:
- Урт нь 1024 байтаар хязгаарлагдана. Backtrace зэрэг өгөгдөлд хангалтгүй зай.
- Бүтэцлэгдсэн syslog-д өгөгдлийн төрөл байхгүй. Тоо, тэмдэгт мөрийг ялгах боломжгүй.
- RFC-үүд нэлээд хатуу боловч syslog-ийн аялгуу (dialect) маш олон тул бүгдийг нь задлан уншиж чадахгүй.
- Шахалт байхгүй.
Syslog нь машин эсвэл сүлжээний төхөөрөмжийн системийн мессежийг логлоход хангалттай бол GELF нь аппликейшний дотроос логлоход сайн сонголт. Олон программчлалын хэл, логын framework-д зориулсан сан (library), appender байдаг тул GELF-г нэвтрүүлэхэд хялбар. GELF-г UDP-ээр илгээж болдог тул timeout, холболтын алдаа зэрэг таны аппликейшнийг гацаах зүйлгүйгээр exception бүрийг лог мессеж болгон Security Data Lake руу илгээж чадна.
GELF via UDP (UDP-ээр GELF)
SO_REUSEPORT socket сонголтыг ашигладаг бөгөөд энэ нь Linux kernel-ийн 3.9 хувилбараас эхэлсэн. Иймээс UDP оролт 3.9-өөс хуучин Linux kernel хувилбарууд дээр ажиллахгүй.Chunking (мессежийг хэсэгчлэх)
UDP datagram-ын хэмжээ 65536 байтаар хязгаарлагдана. Security Data Lake-ийн зарим бүрэлдэхүүн хэсэг 8192 байт хүртэл боловсруулах хязгаартай. Сайтар шахсан мэдээлэл хязгаарт багтдаг ч илгээх мэдээлэл илүү их байж болох тул Security Data Lake нь chunked GELF-г дэмждэг.
GELF мессежийн өмнө байт толгой (header) залгаж мессежийг хэсгүүдэд хуваана. Толгойд мессежийн ID болон дарааллын дугаар орох бөгөөд тэдгээрээр мессежийг дараа нь дахин нэгтгэнэ. GELF сангуудын ихэнх нь chunking-г өөрөө хийдэг бөгөөд мессеж нэг datagram-д багтахгүй хэт том бол автоматаар илрүүлнэ.
TCP нь энэ асуудлыг тээврийн түвшинд шийддэг ч шийдэхэд илүү хэцүү өөр асуудалтай: удаан холболт, timeout болон бусад сүлжээний асуудал.
UDP-ээр мессеж алдагдаж болно, харин TCP-г болгоомжгүй зохиовол аппликейшн бүхэлдээ доголдож болно.
Мэдээж, ялангуяа өндөр ачаалалтай орчинд TCP тохиромжтой. Олон GELF сан TCP болон UDP хоёр тээвэрлэлтийг дэмждэг бөгөөд зарим нь HTTPS-ийг мөн дэмждэг.
GELF мессежийг хэсэгчилсэн болгохын тулд мессежийн өмнө дараах бүтцийг залгана:
- Chunked GELF magic bytes - 2 байт:
0x1e 0x0f - Message ID - 8 байт: Тухайн мессежийн хэсэг бүрт ижил байх ёстой. Мессежийг бүхэлд нь тодорхойлох бөгөөд хэсгүүдийг дараа нь нэгтгэхэд ашиглана. Жишээ нь миллисекундын цаг болон hostname-ээс үүсгэж болно.
- Sequence number - 1 байт: Тухайн хэсгийн дарааллын дугаар. 0-ээс эхэлж, үргэлж sequence count-аас бага байна.
- Sequence count - 1 байт: Мессеж нийт хэдэн хэсгээс бүрдэхийг заана.
Compression (шахалт)
Тээврийн түвшинд UDP ашиглахад GELF мессежийг шахаагүй, эсвэл GZIP буюу ZLIB-ээр шахаж илгээж болно.
Security Data Lake шахалтын төрлийг GELF magic byte толгойгоос автоматаар илрүүлнэ.
CPU-ийн ачааллыг бага зэрэг нэмэгдүүлж сүлжээний зурвасын өргөнийг хэмнэх эсэхээ шийднэ үү. Протоколын өгөгдмөл нь GZIP.
GELF via TCP (TCP-ээр GELF)
GELF TCP одоогоор зөвхөн шахаагүй, хэсэгчлээгүй өгөгдлийг дэмждэг. Нэг TCP холболтоор илгээхдээ мессеж бүрийг null байтаар (\0) тусгаарлах ёстой.
GELF Payload Specification (GELF өгөгдлийн дэлгэрэнгүй тодорхойлолт)
Version 1.1 (11/2013)
GELF мессеж нь дараах талбаруудтай JSON тэмдэгт мөр:
version- string (UTF-8)
- GELF-ийн спецификацийн хувилбар – “1.1”; клиент сан заавал тохируулсан байх ёстой.
host- string (UTF-8)
- энэ мессежийг илгээсэн хост, эх сурвалж эсвэл аппликейшний нэр; клиент сан заавал тохируулсан байх ёстой.
short_message- string (UTF-8)
- товч, тайлбарласан мессеж; клиент сан заавал тохируулсан байх ёстой.
full_message- string (UTF-8)
- backtrace агуулж болох урт мессеж; заавал биш.
timestamp- integer
- UNIX epoch-оос хойших секунд, миллисекундыг заахын тулд аравтын бутархай орон нэмж болно; клиент сан тохируулах нь зүйтэй. Байхгүй бол одоогийн цагийг (now) автоматаар тавина.
level- integer
- syslog-ийн стандарт түвшинтэй тэнцүү түвшин; заавал биш. Өгөгдмөл утга нь 1 (ALERT).
facility- string (UTF-8)
- заавал биш, хуучирсан (deprecated). Оронд нь нэмэлт талбар болгон илгээнэ.
line- integer
- алдаа үүсгэсэн файлын мөр (аравтын тоо); заавал биш, хуучирсан. Оронд нь нэмэлт талбар болгон илгээнэ.
file- string (UTF-8)
- алдаа үүсгэсэн файл (хүсвэл замтай нь) (тэмдэгт мөр); заавал биш, хуучирсан. Оронд нь нэмэлт талбар болгон илгээнэ.
_<additional field>- string (UTF-8) эсвэл integer
- доогуур зураасаар (_) эхэлсэн таны илгээсэн талбар бүрийг нэмэлт талбар гэж үзнэ. Талбарын нэрэнд үсэг, тоо, доогуур зураас, зураас, цэг (word character) оруулж болно. Шалгах regular expression: ^[\\w\\.\\-]*$. Сангууд нэмэлт талбар болгон id (_id) илгээхийг зөвшөөрөх ёсгүй. Security Data Lake энэ талбарыг автоматаар орхино.
Example Payload (жишээ өгөгдөл)
Энэ бол GELF мессежийн жишээ. Security Data Lake үүнийг GZIP/ZLIB шахалттай, эсвэл шинэ мөргүй энгийн socket-ээр шахаагүй илгээсэн ч мессеж болгон хүлээн авч хадгална.
\n escape дарааллаар тэмдэглэх ёстой.{
"version": "1.1",
"host": "example.org",
"short_message": "A short message that helps you identify what is going on",
"full_message": "Backtrace here\n\nmore stuff",
"timestamp": 1385053862.3072,
"level": 1,
"_user_id": 9001,
"_some_info": "foo",
"_some_env_var": "bar"
}Sending GELF Messages via UDP Using Netcat (Netcat ашиглан UDP-ээр GELF мессеж илгээх)
<forwarder-host> дээр ажиллаж буй GELF UDP оролт руу, 12201 порт руу жишээ мессеж илгээх:
echo -n '{ "version": "1.1", "host": "example.com", "short_message": "A short message", "level": 5, "_some_info": "foo" }' | nc -w0 -u <forwarder-host> 12201Sending GELF Messages via TCP Using Netcat (Netcat ашиглан TCP-ээр GELF мессеж илгээх)
<forwarder-host> дээр ажиллаж буй GELF TCP оролт руу, 12201 порт руу жишээ мессеж илгээх:
echo -n -e '{ "version": "1.1", "host": "example.com", "short_message": "A short message", "level": 5, "_some_info": "foo" }'"\0" | nc -w0 <forwarder-host> 12201Sending GELF Messages Using Curl (Curl ашиглан GELF мессеж илгээх)
<forwarder-host>:12201/gelf дээр ажиллаж буй GELF оролт руу жишээ мессеж илгээх:
curl -X POST -H 'Content-Type: application/json' -d '{ "version": "1.1", "host": "example.com", "short_message": "A short message", "level": 5, "_some_info": "foo" }' '<forwarder-host>:12201/gelf'GELF Inputs (GELF оролтууд)
Security Data Lake Extended Log Format (GELF) нь сонгодог энгийн Syslog-ийн дутагдлаас зайлсхийсэн, аппликейшний түвшнээс логлоход төгс лог формат юм. Үүнд сонголтоор шахалт, хэсэгчлэх боломж, хамгийн чухал нь тодорхой бүтэц бий. GELF мессежийг UDP, TCP эсвэл HTTP-ээр оролт болгон хүлээн авч болно. Үүнээс гадна дараалал (queue) ашиглах боломжтой.
Docker, fluentd зэрэг зарим аппликейшн GELF мессежийг өөрсдөө илгээж чадна. Үүнээс гадна олон framework, программчлалын хэлд зориулсан олон арван GELF сан бий.
/gelf замд ирэх HTTP post-г сонсоно.GELF HTTP
GELF-ийн бүх төрлийг HTTP-ээр илгээж болно, үүнд энгийн JSON тэмдэгт мөр болох шахаагүй GELF багтана. Энэ оролт нь authorization header тохируулахыг дэмждэг бөгөөд нууц үгтэй төстэй хамгаалалт нэмнэ. Тохируулсан бол хүсэлт илгээж буй клиент бүр зөв authorization header-ийн нэр, утгыг хүсэлт бүрт өгөх ёстой, эс бөгөөс хүсэлтийг хүлээн авахгүй.
Шинэ оролтоо эхлүүлсний дараа дараах талбаруудыг өөрийн хүссэнээр тохируулна:
Оролт үүсгэх, тохируулах талаар Setting up a new Input (Creating a new Listener input хэсэг)-ийг үзнэ үү.
Оролтыг дараах сонголтуудаар тохируулна:
- Title — Оролтод давтагдашгүй нэр өгнө, жишээ нь:
GELF HTTP Input for XYZ Source. - Bind address — Оролт сонсох IP хаягийг оруулна. Эх сурвалж систем/өгөгдөл лог илгээх IP/оролт энэ.
- Port — IP хаягтай хамт ашиглах портыг оруулна.
- Receive Buffer Size (заавал биш) — Оролтоор орж ирэх траффикийн хэмжээнээс хамаарна: өгөгдлийн урсгалыг хангалттай хангах том, харин систем буферлэсэн өгөгдлийг боловсруулахад нөөцөө үрэхээс сэргийлэх жижиг утга байх ёстой.
- Enable TLS — Энэ оролт TLS ашиглах эсэхийг сонгоно.
- TCP keepalive — Идэвхгүй холболтыг таслахаас сэргийлэхийн тулд оролт TCP keep-alive пакетыг дэмжихийг хүсвэл идэвхжүүлнэ.
- Enable Bulk Receiving — Шинэ мөрөөр (
\nэсвэл\r\n) тусгаарласан олон мессежийг нэг дор хүлээн авахыг хүсвэл идэвхжүүлнэ. - Enable CORS — Cross-Origin Resource Sharing (CORS)-г идэвхжүүлснээр сервер HTTP хариунд тусгай header илгээж, хөтөчид өөр эх сурвалжаас ирэх хүсэлтийг зөвшөөрүүлнэ.
- Max. HTTP chunk size (заавал биш) — Их хэмжээний өгөгдлийг буферыг дарамтлахгүйн тулд жижиг блок (жишээ нь 8KB эсвэл 64KB) болгон хуваах нь түгээмэл. HTTP chunk-ийн дээд хэмжээ 65536 байт.
- Idle writer timeout (заавал биш) — Клиент гаралтын урсгалд бичих өгөгдлөө илгээхийг сервер хүлээх дээд хугацаа. Үүнээс хэтэрвэл идэвхгүй гэж үзээд холболтыг таслана.
- Authorization Header Name (заавал биш) — Хүлээн авсан бүх мессежид нэвтрэлт шалгахын тулд өөрийн authorization header-ийн нэрийг зааж өгнө. Энэ оролтод нууц үгтэй төстэй хамгаалалт нэмэх арга.
- Authorization Header Value (заавал биш) — Хүлээн авсан бүх мессежид нэвтрэлт шалгахын тулд authorization header-ийн утгыг зааж өгнө.
- Encoding (заавал биш) — Бүх мессеж оролтод тохируулсан encoding-ийг дэмжих ёстой. Жишээ нь UTF-8 encoding-той мессежийг UTF-16 дэмжихээр тохируулсан оролт руу илгээж болохгүй.
- Override source (заавал биш) — Өгөгдмөлөөр мессеж source талбарыг лог мессеж дэх hostname гэж задлан уншдаг. Хэрэв стандарт бус эсвэл тохируулах боломжгүй hostname гаргадаг төхөөрөмжид энэ тохиргоог өөрчлөхийг хүсвэл энд өөр source нэр зааж болно.
- Decompressed size limit — Мессежийг задалсны дараах дээд хэмжээ.
GELF HTTP оролтыг эхлүүлсний дараа мессеж илгээхэд дараах endpoint-ийг ашиглана:
http://<forwarder-host>:port/gelf (POST)Жишээ мессежийг curl-ээр илгээж үзнэ үү:
curl -XPOST http://<forwarder-host>:12202/gelf -p0 -d '{"short_message":"Hello there", "host":"<forwarder-host>", "facility":"test", "_foo":"bar"}'Keep-alive болон шахалтыг HTTP-ийн түгээмэл header-ээр дэмждэг. Мессежийг боловсруулахаар хүлээн авбал сервер 202 Accepted HTTP статус буцаана.
Enable the Bulk Receiving Option for the HTTP GELF Input (HTTP GELF оролтод Bulk Receiving сонголтыг идэвхжүүлэх)
Security Data Lake нь HTTP GELF оролтоор олон мессежийг шинэ мөр тэмдэгтээр тусгаарласан байдлаар нэг дор хүлээн авах (bulk receiving) сонголттой.
Энэ сонголтыг идэвхжүүлсэн үед оролт \n эсвэл \r\n-ээр тусгаарласан олон GELF мессежийг автоматаар салгаж авна.
curl хүсэлтийн жишээ:
curl -XPOST -v http://<forwarder-host:12202/gelf -p0 \
-d $'{"short_message":"Bulk message 1", "host":"example.com", "facility":"test", "_foo":"bar"}\r\n\
{"short_message":"Bulk message 2", "host":"<forwarder-host>", "facility":"test", "_foo":"bar"}\r\n\
{"short_message":"Bulk message 3", "host":"<forwarder-host>", "facility":"test", "_foo":"bar"}\r\n\
{"short_message":"Bulk message 4", "host":"<forwarder-host>", "facility":"test", "_foo":"bar"}\r\n\
{"short_message":"Bulk message 5", "host":"<forwarder-host>", "facility":"test", "_foo":"bar"}'Transfer-Encoding: chunked-ийг дэмждэг бөгөөд энэ дэмжлэг bulk receiving боломжид (Enable Bulk Receiving сонголт идэвхтэй үед) мөн хамаарна.GELF TCP
Оролт үүсгэх, тохируулах талаар Setting up a new Input (Creating a new Listener input хэсэг)-ийг үзнэ үү.
Оролтыг дараах сонголтуудаар тохируулна:
- Title — Оролтод давтагдашгүй нэр өгнө, жишээ нь:
GELF TCP Input for XYZ Source. - Bind address — Оролт сонсох IP хаягийг оруулна. Эх сурвалж систем/өгөгдөл лог илгээх IP/оролт энэ.
- Port — IP хаягтай хамт ашиглах портыг оруулна.
- Receive Buffer Size (заавал биш) — Оролтоор орж ирэх траффикийн хэмжээнээс хамаарна: өгөгдлийн урсгалыг хангалттай хангах том, харин систем буферлэсэн өгөгдлийг боловсруулахад нөөцөө үрэхээс сэргийлэх жижиг утга байх ёстой.
- Enable TLS — Энэ оролт TLS ашиглах эсэхийг сонгоно.
- TCP keepalive — Идэвхгүй холболтыг таслахаас сэргийлэхийн тулд оролт TCP keep-alive пакетыг дэмжихийг хүсвэл идэвхжүүлнэ.
- Null frame delimiter — Энэ сонголтыг ихэвчлэн сонгохгүй орхино. Мессеж бүрийн таслагч нь шинэ мөр.
- Maximum message size — Мессежийн дээд хэмжээ. Өгөгдмөл утга ихэвчлэн хангалттай, харин мессежийн уртаас хамаарч өөрчилж болно. Оролтын төрөл бүр мессежийн дээд уртын тодорхойлолттой байдаг.
- Encoding — Бүх мессеж оролтод тохируулсан encoding-ийг дэмжих ёстой. Жишээ нь UTF-8 encoding-той мессежийг UTF-16 дэмжихээр тохируулсан оролт руу илгээж болохгүй.
- Override source — Өгөгдмөлөөр мессеж source талбарыг лог мессеж дэх hostname гэж задлан уншдаг. Хэрэв стандарт бус эсвэл тохируулах боломжгүй hostname гаргадаг төхөөрөмжид энэ тохиргоог өөрчлөхийг хүсвэл энд өөр source нэр зааж болно.
- Decompressed size limit — Мессежийг задалсны дараах дээд хэмжээ.
Энэ хуудсанд гарсан нэр томъёо
- Endpoint
- Хамгаалж буй компьютер, сервер, виртуал машин
