Ubuntu 20.04
sudo acces
Java11(openJDK11)
مجموعهی Elastic Stack (در گذشته ELK Stack) مجموعهای از نرمافزارهای متن-بازه(open-source) که توسط Elastic تولید و توسعه داده شده و به شما اجازه میده انواع log fileهای تولید شده با هر قالبی توسط هر منبعی رو جمعآوری، جستجو، تحلیل و بررسی و در اَشکالِ مختلفِ قابلِ درک، نمایش بدید. روشی که با عنوان "گزارشگیری متمرکز" (centralized logging) شناخته میشه.
روش centralized logging میتونه در زمانِ تشخیصِ یک مشکلِ رخ داده در serverها یا applicationها، با ایجادِ امکانِ جستجو در بین تمام log fileها در یک نقطهی متمرکز، به ما کمک کنه. همچنین امکان شناسایی مشکلاتی رو که بین چندین server گسترش یافته، از طریق یک جستجوی مرتبط بین logهای تولید شده توسط اونها، در یک بازهی زمانی مشخص، برای ما فراهم میکنه.
مجموعهی Elastic Stack شامل چهار component زیره:
ـ Kibana: یک web interface برای جستجو و نمایش گزارشات.
ـ Elasticsearch: یک موتورجستجوی توزیعشدهی RESTful که تمام دادههای جمعآوری شده رو ذخیره
میکنه.
ـ Logstash: جزء پردازش کننده دادهها در Elastic Stack که دادههای ورودی رو پردازش کرده و به
Elasticsearch ارسال میکنه.
ـ Beats: یک حملکنندهی دادهی (data shipper) سبُک و تک منظوره که میتونه دادهها رو از صدها و یا
هزاران ماشین مختلف به سوی Logstash یا Elasticsearch ارسال کنه.
اجزاء(componentهای) Elasticsearch در repositoryهای پیشفرض Ubuntu موجود نیستند. بنابراین ابتدا باید از طریق دستور apt منابع اونها رو به بسته های سیستمعامل اضافه کنیم. لازم به ذکره که تمام بسته های مربوطه، توسط کلید Elasticsearch در اصطلاح sign شدهن تا از سیستم شما در برابر کدها یا نرم افزارهای تقلبی محافظت کنن.
در ابتدا نیاز داریم با اجرای دستور زیر کلید عمومیِ Elasticsearch GPG رو در APT وارد کنیم:
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
در مرحله بعد لیست منبع Elastic رو به فهرست sources.list.d اضافه میکنیم. جایی که APT برای جستجوی منابع جدید به اون مراجعه میکنه:
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list
و بعد با استفاده از دستورات زیر باید repository رو بروزرسانی کرده و نرمافزار رو نصب کنیم:
sudo apt-get update sudo apt-get install elasticsearch
حالا Elasticsearch نصب شده و آمادهست برای پیکربندی. از اونجایی که فایل پیکربندی یک فایل متنیه، ما از nano text editor برای ویرایش اون استفاده میکنیم:
sudo nano /etc/elasticsearch/elasticsearch.yml
نکته مهم: از اونجا که فایل پیکربندی از نوع YAML است، در استفاده از جایخالی(space) بسیار دقت کنید!!
فایل elasticsearch.yml امکانات متنوعی رو برای پیکربندی در اختیار ما قرار میده. مثل تنظیماتی برای gateway, discovery, network, memory, path, node, cluster و .. .
بیشتر این گزینه ها از پیش تنظیم شدهن ولی ما میتونیم بسته به نیازمون اونها رو تغییر بدیم.
سرویس Elasticsearch به صورت خودکار آغاز به کار نمیکنه، بنابراین باید اون رو به صورت دستی فعال کنیم
sudo systemctl enable --now elasticsearch.service
سرویس Elasticsearch به ترافیک درگاه 9200 توجه میکنه. پس برای بررسی صحت راهاندازی سرویس این درخواست HTTP رو اجرا میکنیم:
curl -X GET "localhost:9200"
و انتظار میره که چنین پاسخی دریافت کنین:
{
"name" : "Elasticsearch",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "qqhFHPigQ9e2lk-a7AvLNQ",
"version" : {
"number" : "7.7.1",
"build_flavor" : "default",
"build_type" : "deb",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.5.1",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
براساس توصیهی رسمی، باید بلافاصله بعد از Elasticsearch، نرمافزار Kibana رو نصب کنیم. از این طریق میتونیم اطمینان حاصل کنیم که وابستگیهای componentها با ترتیب درستی اضافه شده و در جای صحیح قرار میگیرن.
چون قبلا repository رو بروز کردیم، با استفاده از دستور زیر Kibana رو نصب میکنیم:
sudo apt install kibana
در مرحله بعد باید فایل kibana.yml رو در آدرس etc/kibana/kibana.yml/ ویرایش کرده و تغییرات زیر رو اعمال کنیم:
server.port: 5601 server.host: "localhost" elasticsearch.host: ["http://localhost:9200"]
و در نهایت برای فعالسازی و راهاندازی اون، دستورات زیر رو اجرا میکنیم:
sudo systemctl enable kibana sudo systemctl start kibana
و تمام. برای بررسی اولیهی kibana یک browser باز کرده و آدرس http://localhost:5601 رو مشاهده کنید.
با وجود اینکه برای Beats امکان ارسال دادهها به Elasticsearch به صورت مستقیم هم وجود داره، اما بسیار معموله که برای پردازش دادهها در بین راه، از Logstash استفاده کنیم. این کار به ما این امکان رو میده که در جمعآوری دادهها از منابع مختلف، انعطاف بیشتری داشته باشیم و بتونیم دادهها رو در یک قالب و شکل مشترک منتقل کرده و در نهایت به راحتی اونها رو برای ذخیره در یک پایگاهدادهی(database) دیگه استخراج کنیم.
برای نصب Logstash از دستور زیر استفاده میکنیم:
sudo apt install logstash
بعد از نصب میریم سراغ پیکربندی. فایلهای پیکربندی Logstash در مسیر etc/logstash/conf.d/ قرار دارند. برای کسب اطلاعات بیشتر در مورد نحوه پیکربندی، میتونید صفحهی مرجع پیکربندی Logstash رو که توسط Elastic ارائه شده، با دقت بیشتری مطالعه کنید.
نرمافزار Logstash قابلیتهای بسیار زیادی برای سفارشیسازی داره. برای درک بیشتر، بهتره Logstash رو یک دنبالهی خطی از ماژولهای پردازشی(pipeline) در نظر بگیرید که از یک سو دادهها رو دریافت میکنه، با یک یا چند روش اونها رو پردازش میکنه و در نهایت محصول رو به مقصد(در اینجا Elasticsearch) ارسال میکنه.
یک دنبالهی پردازشیِ Logstash، دارای حداقل دو مولفهی اجباری ورودی و خروجی(input,output) و یک یا چند مولفهی اختیاری پالایشه(filter). همونطور که از اسامی مشخصه، ماژول input، داده رو از یک منبع دریافت میکنه، ماژولهای filter داده رو پردازش میکنن و در نهایت ماژول output داده رو به مقصد میفرسته.
یک مثال ساده برای پیکربندی logstash میتونه مثل زیر باشد:
ابتدا یک فایل در مسیر فایلهای پیکربندی Logstash با نام دلخواه ایجاد میکنیم:
sudo nano /etc/logstash/conf.d/from-beats-to-elastic.conf
مقادیر زیر رو در فایل نوشته و ذخیره میکنیم:
input { beats { port => "5044" } } filter { grok { match => {"message" => "% COMBINEDAPACHELOG}"} } } output { stdout {codec => rubydebug} }
برای بررسی صحت فایل پیکربندی، میتونیم از دستور زیر استفاده کنیم:
sudo -u logstash /usr/share/logstash/bin/logstash --path.settings /etc/logstash -t
در صورتی که مشکلی در فایلهای پیکربندی نباشه، بعد از لحظاتی پیغام زیر مشاهده میشه:
Config Validation Result: OK. Exiting Logstash
و در نهایت، برای فعالسازی و راهاندازی اون از دستورات زیر استفاده میکنیم:
sudo systemctl start logstash sudo systemctl enable logstash
مجموعهی Elastic Stack از چندین حاملِدادهی (data shipper) متنوع با نام Beats، برای جمعآوری داده از منابع مختلف و ارسال اونها به Logstash یا Elasticsearch استفاده میکنه. انواع Beats را میتونید در زیر مشاهده کنید:
ـ Filebeat: جمعآوری و انتقال فایلهای گزارش (log file)
ـ Metricbeat: جمعآوری دادههای اندازهای(metrics) از سیستمها و سرویسهای شما
ـ Packetbeat: جمعآوری و آنالیز دادههای شبکه
ـ Winlogbeat: جمعآوری دادههای رویدادهای ویندوزی
ـ Auditbeat: جمعآوری داده های چارچوب حسابرسی لینوکس(Linux audit framework) و نظارت بر یکپارچگی فایلها
ـ Heartbeat:نظارت بر سرویسها از نظر دردسترسبودن با استفاده از یک نوع جستجو و کاوش فعال
در این راهنما ما از Filebeat برای انتقال فایلهای log به Elastic Stack استفاده میکنیم.
برای نصب Filebeat از دستور زیر استفاده میکنیم:
sudo apt install filebeat
در مرحله بعد برای پیکربندی Filebeat فایل filebeat.yml را ویرایش میکنیم:
sudo nano /etc/filebeat/filebeat.yml
نرمافزار Filebeat از خروجیهای بیشماری پشتیبانی میکنه اما ما معمولاً دادهها رو یا مستقیماً به سمت Elasticsearch و یا برای پردازش اضافی به سمت Logstash ارسال میکنیم. چون در این راهنما ما از Logstash استفاده کردیم، خروجیهای مربوط به Elasticsearch را غیرفعال کرده و بعد، بخش خروجیهای Logstash را فعال میکنیم.
برای این کار باید خطوط بلااستفاده در فایل پیکربندی Filebeat رو comment کرده و خطوط مورد استفاده رو uncomment کنیم:
#output.elasticsearch: #hosts: ["localhost:9200"] … output.logstash: hosts: ["localhost:5044"]
عملکرد Filebeat را میتونیم با استفاده از ماژولهای Filebeat بهبود ببخشیم. در این راهنما ما از ماژول system استفاده میکنیم که logهای تولید شده توسط system logging service، مربوط به توزیعهای رایج لینوکس رو جمعآوری و تجزیه میکند.
برای فعال کردن ماژول system از دستور زیر استفاده میکنیم:
sudo filebeat modules enable system
و برای بررسی فعال شدن ماژول، دستور زیر رو اجرا میکنیم:
sudo filebeat modules list
اگه همه چیز درست پیش رفته باشه باید خروجی زیر رو مشاهده کنیم:
Enabled:
system
Disabled:
apache2
auditd
elasticsearch
icinga
iis
kafka
kibana
logstash
mongodb
mysql
nginx
osquery
postgresql
redis
traefik
...
در مرحله بعد، باید ورودیهای Filebeat که دادهها رو قبل از ارسال از طریق logstash به Elasticsearch تجزیه(parse) میکنن تنظیم کنیم.
برای این کار دستور زیر را اجرا می کنیم:
sudo filebeat setup --pipelines --modules system
حالا باید الگوی شاخص Elasticsearch رو در Filebeat بارگذاری کنیم:
sudo filebeat setup --index-management -E output.logstash.enabled=false -E 'output.elasticsearch.hosts=["localhost:9200"]'
شاخص Elasticsearch مجموعه اسنادیه که دارای ویژگیهای مشابه هستن. این شاخصها با یک نام مشخص میشن. در لحظهی ایجادِ یک شاخصِ جدید، الگویِ شاخص به طور خودکار بروزرسانی میشه.
بعد از اجرای دستور بالا خروجی زیر مشاهده میشه:
Index setup finished.
بسته نرم افزاری Filebeat با نمونه داشبوردهای Kibana همراهه که به ما امکان میده دادههای Filebeat رو در Kibana نمایش بدیم. برای استفاده از این داشبوردها، باید الگویِ شاخص اونها رو ایجاد کرده و داشبوردها رو در Kibana بارگذاری کنیم.
با بارگذاری داشبوردها، Filebeat برای بررسیِ اطلاعاتِ نسخه، به Elasticsearch متصل میشه. برای بارگذاری داشبورد هنگام فعال بودنِ Logstash ، باید اول خروجیِ Logstash رو غیرفعال کرده و خروجیِ Elasticsearch رو از طریق دستور زیر فعال کنیم:
sudo filebeat setup -E output.logstash.enabled=false -E output.elasticsearch.hosts=['localhost:9200'] -E setup.kibana.host=localhost:5601
پس از اجرای دستور باید چنین خروجی رو مشاهده کنیم:
Overwriting ILM policy is disabled. Set `setup.ilm.overwrite:true` for enabling.
Index setup finished.
Loading dashboards (Kibana must be running and reachable)
Loaded dashboards
Setting up ML using setup --machine-learning is going to be removed in 8.0.0. Please use the ML app instead.
See more: https://www.elastic.co/guide/en/elastic-stack-overview/current/xpack-ml.html
Loaded machine learning job configurations
Loaded Ingest pipelines
حالا میتونیم Filebeat رو راه اندازی و فعال کنیم:
sudo systemctl start filebeat sudo systemctl enable filebeat
برای بررسی اینکه Elasticsearch واقعاً این دادهها رو دریافت میکنه، با استفاده از دستور زیر شاخص Filebeat رو جستجو میکنیم:
curl -XGET 'http://localhost:9200/filebeat-*/_search?pretty'
و انتظار داریم چنین خروجیای دریافت کنیم:
{
{
"took" : 4,
"timed_out" : false,
"_shards" : {
"total" : 2,
"successful" : 2,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 4040,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "filebeat-7.7.1-2020.06.04",
"_type" : "_doc",
"_id" : "FiZLgXIB75I8Lxc9ewIH",
"_score" : 1.0,
"_source" : {
"cloud" : {
"provider" : "digitalocean",
"instance" : {
"id" : "194878454"
},
"region" : "nyc1"
},
"@timestamp" : "2020-06-04T21:45:03.995Z",
"agent" : {
"version" : "7.7.1",
"type" : "filebeat",
"ephemeral_id" : "cbcefb9a-8d15-4ce4-bad4-962a80371ec0",
"hostname" : "june-ubuntu-20-04-elasticstack",
"id" : "fbd5956f-12ab-4227-9782-f8f1a19b7f32"
},
...
در یک browser آدرس http://localhost:5601 رو مشاهده کنید.
در صفحه پیش رو، در منویِ Discover، الگویِ شاخصِ از پیشتعریفشدهی *-filebeat رو انتخاب کنید تا دادههای ارسالی Filebeat رو مشاهده کنید. به طور پیشفرض، در اینجا همهی اطلاعاتِ ثبت شده در 15 دقیقهی گذشته رو میتونیم ببینیم. در بخش پایینی هم یک هیستوگرام، مربوط به رویدادهای ورود به سیستم و برخی دیگر از پیامهای ورود به سیستم رو مشاهده میکنیم.
در اینجا، می تونیم دربین دادههای log جستجو و مرور کنیم و همچنین داشبورد خودمون رو سفارشی کنیم. با استفاده از پنل سمت چپ میتونیم به صفحه داشبورد بریم و داشبورد Filebeat System را جستجو کنیم. در قدم بعد، می تونیم داشبوردهای نمونهای رو که با ماژول سیستم Filebeat سازگار هستند انتخاب کنیم.
در این راهنما، سعی کردم با بیان ساده و تا حدودی فنی، به مختصرترین شکل ممکن، تعریف کنم چطور Elastic Stack رو برای جمعآوری و تجزیه و تحلیلِ فایلهای log مربوط به سیستم، نصب و پیکربندی کنید. یادتون باشه که میتونید تقریباً هر نوع اطلاعاتِ ورودی به سیستم، یا دادههای index شده رو با استفاده از Beats به Logstash ارسال کنید، اما اگر دادهها با ماژولهایِ پالایشِ Logstash، تجزیه و ساختاربندی بشن مفیدتر میشن، چون با این کار، دادهها به قالبی سازگار و قابل خوندن توسط Elasticsearch تبدیل میشن.
این راهنما با استفاده از مطالعهی سایتهای مختلف که در زیر لیست اونها اومده، به همراهِ بهرهگیری از تجربهی شخصیِ پیادهسازیِ Elastic Stack، نوشته شده و ممکنه کامل نباشه یا دارای ایراداتی در نوع پیادهسازی یا تنظیمات باشه. خوشحال میشم اگر نظری، انتقادی یا پیشنهادی دارید حتماً با من درمیون بذارید.