Apinizer üzeridne tutulan logların başka ortamlara aktarılması ya da başka ürünler kullanılarak incelenmesi gerekebilir.

Bu gibi durumlarda Apinizer Log veri tabanı ElasticSearch'de tutulan verilerin sorgu ile alınması ve dosyaya kaydedilmesi gereklidir. Elastic Search yapısı gereği yapılan sorgulamalara 1000'den fazla kayıt dönmemektir. 

Toplam kayıt sayısının 1000'i geçtiği durumlarda Scroll API ile sorgulama yapılması gerekmektedir. 

Scroll API ile gelen sonucun işlenerek tekrar sorgulama yapılması gerekebileceğinden bu işlem bir döngü içinde yapılmalıdır.

Bu döngünün Linux Script ile uygulanmış haline aşağıda ulaşabilirsiniz.

Ön Gereksinim: JQ(Json Processor) Kurulumu

Bash Script'in düzgün çalışabilmesi JQ paketinin sunucuya kurulması gereklidir.

Bu kurulum için aşağıdaki adımları takip edebilirsiniz:

1.EPEL deposunu kurun

yum install epel-release -y
CODE


2.Sunucunuzu güncelleyin

 yum update -y
CODE


3.jq(JSON Processor) aracını kurun

 yum install jq -y
CODE


Scroll Yapan Script

Aşağıdaki scriptin script.sh adıyla bir dizine kaydedilip, chmod 777 komutu ile executable yapılması gereklidir.

#!/bin/bash

es_url='http://<ELASTICSEARCH_IP>:9200'
index=apinizer-log-apiproxy-<XXXX>


response=$(curl -X GET -s $es_url/$index/_search?scroll=1m -H 'Content-Type: application/json' -d @query.json)
scroll_id=$(echo $response | jq -r ._scroll_id)
hits_count=$(echo $response | jq -r '.hits.hits | length')
hits_so_far=${hits_count}
echo Got initial response with $hits_count hits and scroll ID $scroll_id

# process first page of results here (ex. put the response into result.json)
echo $response | jq . >> result.json

while [ "$hits_count" != "0" ]; do

 
  response=$(curl -X GET -s $es_url/_search/scroll -H 'Content-Type: application/json' -d "{ \"scroll\": \"1m\", \"scroll_id\": \"$scroll_id\" }")
  scroll_id=$(echo $response | jq -r ._scroll_id)
  hits_count=$(echo $response | jq -r '.hits.hits | length')
  hits_so_far=$((hits_so_far + hits_count))
  echo "Got response with $hits_count hits (hits so far: $hits_so_far), new scroll ID $scroll_id"

  # process page of results (ex. put the response into result.json)
  echo $response | jq . >> result.json
done

echo Done!

#script reference: https://gist.github.com/toripiyo/8b14e8a387069bae372d49296b0077d7

CODE

Örnek Sorgu

Aşağıdaki sorgunun query.json adıyla script.sh dosyasıyla aynı dizine kaydedilmesi gereklidir.

Bu sorgunun Apinizer ElasticSearch adresine gönderilmesi gerekli olduğundan istek yapılan adres ve index adının kendi ortamınıza göre düzeltilmesi gereklidir.

curl --location --request POST 'http://<ELASTICSEARCH_IP>:9200/apinizer-log-apiproxy-abcd/_search' --header 'Content-Type: application/json' --data-raw '{
    "from": 0,
    "size": 3000000,
    "query": {
        "bool": {
            "filter": [
                 
                {
                    "bool": {
                        "filter": [
                            {
                                "bool": {
                                    "filter": [
                                        {
                                            "match": {
                                                "uok": {
                                                    "query": "username",
                                                    "operator": "OR",
                                                    "prefix_length": 0,
                                                    "max_expansions": 50,
                                                    "fuzzy_transpositions": true,
                                                    "lenient": false,
                                                    "zero_terms_query": "NONE",
                                                    "auto_generate_synonyms_phrase_query": true,
                                                    "boost": 1.0
                                                }
                                            }
                                        }
                                    ],
                                    "adjust_pure_negative": true,
                                    "boost": 1.0
                                }
                            }
                        ],
                        "adjust_pure_negative": true,
                        "boost": 1.0
                    }
                },
                {
                    "bool": {
                        "filter": [
                            
                            {
                                "bool": {
                                    "should": [
                                        {
                                            "term": {
                                                "pi": {
                                                    "value": "6130d19b59f2007bff548d29",
                                                    "boost": 1.0
                                                }
                                            }
                                        }
                                    ],
                                    "adjust_pure_negative": true,
                                    "boost": 1.0
                                }
                            },
                            {
                                "range": {
                                    "@timestamp": {
                                        "from": "now-4320m/m",
                                        "to": "now/m",
                                        "include_lower": true,
                                        "include_upper": true,
                                        "boost": 1.0
                                    }
                                }
                            }
                        ],
                        "adjust_pure_negative": true,
                        "boost": 1.0
                    }
                }
            ],
            "adjust_pure_negative": true,
            "boost": 1.0
        }
    },
    "_source": {
        "includes": [
            "@timestamp",
            "uok",
            "fcrb",
            "sc",
            "pet",
            "rt",
            "tch",
            "tcb",
            "hr1ra",
            "et",
            "fcrh"
        ],
        "excludes": []
    }
}'
CODE

Bu sorgu içerisinde yer alan alanların ne anlama geldiğine bakmak için bu sayfayı ziyaret edebilirsiniz.

Scriptin Çalıştırılması

Bunun için yapmanız gereken komut dosyasından ./script.sh yazmak olacaktır.

Sonrasında aşağıdaki şekilde bilgi notları gelmeye başlayacaktır, ve sonuçlar result.json dosyasında birikecektir.