Problemas con la configuracion geoip

Buenos días, a ver si me podéis ayudar.

Tengo problemas para configurar la parte de geoip, esto es lo que tengo configurado hasta ahora:

FIltro para geoip de logstash

filter {
if [type] == "apache_access" {
grok {
match => {"message" => "%{COMBINEDAPACHELOG}" }
}
geoip {
source => "clientip"
target => "geopoint"
database => "/etc/logstash/GeoLiteCity.dat"
add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ]
}
mutate {
convert => [ "[geoip][coordinates]", "float" ]
}
}
}

configuracion de salida de logstash

output {
elasticsearch {
host => "marioneto01"
cluster => "oknels"
action => "index"
index => "logstash-%{+dd.MM.YYYY}"
}
stdout { codec => rubydebug }

También tengo creado un index (no lo estoy usando) pero no se muy bien donde está ubicado ya que lo cree mediante el plugin koft.

Aqui pongo mis mapeos para el apache_access:

{
"logstash-15.09.2015" : {
"mappings" : {
"apache_access" : {
"dynamic_templates" : [ {
"message_field" : {
"mapping" : {
"index" : "analyzed",
"omit_norms" : true,
"type" : "string"
},
"match" : "message",
"match_mapping_type" : "string"
}
}, {
"string_fields" : {
"mapping" : {
"index" : "analyzed",
"omit_norms" : true,
"type" : "string",
"fields" : {
"raw" : {
"index" : "not_analyzed",
"ignore_above" : 256,
"type" : "string"
}
}
},
"match" : "*",
"match_mapping_type" : "string"
}
} ],
"_all" : {
"enabled" : true,
"omit_norms" : true
},
"properties" : {
"@source_host" : {
"type" : "string",
"norms" : {
"enabled" : false
},
"fields" : {
"raw" : {
"type" : "string",
"index" : "not_analyzed",
"ignore_above" : 256
}
}
},
"@timestamp" : {
"type" : "date",
"format" : "dateOptionalTime"
},
"@version" : {
"type" : "string",
"index" : "not_analyzed"
},
"agent" : {
"type" : "string",
"norms" : {
"enabled" : false
},
"fields" : {
"raw" : {
"type" : "string",
"index" : "not_analyzed",
"ignore_above" : 256
}
}
},
"auth" : {
"type" : "string",
"norms" : {
"enabled" : false
},
"fields" : {
"raw" : {
"type" : "string",
"index" : "not_analyzed",
"ignore_above" : 256
}
}
},
"bytes" : {
"type" : "string",
"norms" : {
"enabled" : false
},
"fields" : {
"raw" : {
"type" : "string",
"index" : "not_analyzed",
"ignore_above" : 256
}
}
},
"clientip" : {
"type" : "string",
"norms" : {
"enabled" : false
},
"fields" : {
"raw" : {
"type" : "string",
"index" : "not_analyzed",
"ignore_above" : 256
}
}
},
"file" : {
"type" : "string",
"norms" : {
"enabled" : false
},
"fields" : {
"raw" : {
"type" : "string",
"index" : "not_analyzed",
"ignore_above" : 256
}
}
},
"geoip" : {
"dynamic" : "true",
"properties" : {
"location" : {
"type" : "geo_point"
}
}
},
"host" : {
"type" : "string",
"norms" : {
"enabled" : false
},
"fields" : {
"raw" : {
"type" : "string",
"index" : "not_analyzed",
"ignore_above" : 256
}
}
},
"httpversion" : {
"type" : "string",
"norms" : {
"enabled" : false
},
"fields" : {
"raw" : {
"type" : "string",
"index" : "not_analyzed",
"ignore_above" : 256
}
}
},
"ident" : {
"type" : "string",
"norms" : {
"enabled" : false
},

He quitado algunos porque no entraban en el post.

Por lo que he leido en otros post debiaria cambiar el "type" del clientip en vez de string por "ip" pero no lo he conseguido.

Alguna idea?

Gracias

Hola!

Veo que en tu indice, el tipo de cient ip es string.

"clientip" : {
  "type" : "string",
  "norms" : {
  "enabled" : false
  }
}

Eso deberia ser un geo point. De todas maneras el indice podría crearse automaticamente para poder probar que logstash funciona correctamente con tu configuración.

Puedes darnos el pattern del CominedApacheLog?:

Si podrias incluir tambien algun log de ejemplo eso seria util que para que pudiese crearte un ejemplo de como correctamente configurar esto.

Gracias!

--Gabriel

Muy buenas, ya he conseguido crear un "index pattern"personalizado, tengo mi template, y al arrancar logstash coge el template, eso lo veo desde el plugin kopf directamente, ahora bien, sigo con los problemas.

Mis mapeos son los siguientes para geoip y para client:

"geoip": {
"dynamic": "true",
"properties": {
"location": {
"doc_values": true,
"type": "geo_point"
},
"longitude": {
"doc_values": true,
"type": "float"
},
"latitude": {
"doc_values": true,
"type": "float"
},
"ip": {
"doc_values": true,
"type": "ip"
}
}
},

para client ip:

"clientip": {
    "doc_values": true,
    "type": "ip"
  },

Pero continuo sin ver la parte de geoip dentro de kibana, he regenerado el index y me aparecen los nuevos "filtros"

Esta es mi configuracion en logstash para apache

filter {
if [type] == "apache_error" {
grok {
pattern => "%{COMBINEDAPACHELOG}"
add_field => [ "received_from", "%{host}" ]
}
}
}
filter {
if [type] == "apache_access" {
grok {
match => {"message" => "%{COMBINEDAPACHELOG}" }
}
geoip {
source => "clientip"
target => "geoip"
database => "/etc/logstash/GeoLiteCity.dat"
add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ]
}
mutate {
convert => [ "[geoip][coordinates]", "float" ]
}
}
}
filter {
if [type] == "apache_access_ssl" {
grok {
match => {"message" => "%{COMBINEDAPACHELOG}" }
}
geoip {
source => "clientip"
target => "geoip"
database => "/etc/logstash/GeoLiteCity.dat"
add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ]
}
mutate {
convert => [ "[geoip][coordinates]", "float" ]
}
}
}

y esta mi configuracion para el output de logstash

output {
elasticsearch {
host => "marioneto01"
cluster => "oknels"
protocol => "http"
index => "okn-%{+YYYY.MM.dd}"
template => "/opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-output-elasticsearch-1.0.5-java/lib/logstash/outputs/elasticsearch/okn-template.json"
template_name => "okn-*"
manage_template => "true"
#template_overwrite => "true"

}
stdout { codec => rubydebug }
}

El pattern del apache es el que viene por defecto:

COMMONAPACHELOG %{IPORHOST:clientip} %{USER:ident} %{USER:auth} [%{HTTPDATE:timestamp}] "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})" %{NUMBER:response} (?:%{NUMBER:bytes}|-)

y una muestra de mi salida de apache:

He cambiado el "usuario" por seguridad pero es correcto.

10.29.0.57 - usuario [17/Sep/2015:14:05:18 +0200] "POST /goknlogs/elasticsearch/_msearch?timeout=0&ignore_unavailable=true&preference=1442491467496 HTTP/1.1" 200 47836 "http://10.29.0.71/goknlogs/" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:40.0) Gecko/20100101 Firefox/40.0"

Hola nuevamente!

Pues he probado localmente utilizando la ultima version de la database de ips y estoy obteniendo los resultados correctamente desde mi localidad:

"geoip" => {
                      "ip" => "167.56.12.-",
           "country_code2" => "UY",
           "country_code3" => "URY",
            "country_name" => "Uruguay",
          "continent_code" => "SA",
             "region_name" => "10",
               "city_name" => "Montevideo",
                "latitude" => -,
               "longitude" => -,
                "timezone" => "America/Montevideo",
        "real_region_name" => "Montevideo",
                "location" => [
            [0] -,
            [1] -
        ]

He borrado los datos por seguridad.

Por otro lado, intente con la IP que tu me mandaste, 10.29.0.57 y no es capaz de ubicar esta localidad. Tal vez esta sea una IP interna no una IP publica? Para poder utilizar GeoIps tienes que proveer la IP publica de tus servidores, no la ip privada. Tal vez puedas utilizar el filtro translate para traducir tus IPs por la IP publica de ellos.

De todas maneras puede que tambien tengas algun problema con el add_field y el mutate. Las coordenadas deberian de estar automaticamente resueltas por el filtro geoip, y encontrarias en [geopoint] field la informacion necesaria para tu solucion. Como en el ejemplo que adjunte.

Por favor, dime si esto aclara un poco el problema que estas teniendo.

Gracias!

--Gabriel

Gracias por contestar tan rápido.

Sí, es una ip privada, lo uso así porque estoy probando con una máquina virtual sin ip pública por no probarlo en producción o crear una máquina en la nube para esto, de todas formas entiendo que aunque sea una ip privada debería aparecer el filtro en kibana.

Otra pregunta, ¿es obligatorio tener configurado el modulo para geoip en apache? entiendo que no ya que esto va por otro lado aunque si que coja la ip de los logs de apache, debería contrastarlo con la base de datos de GEOIP.

Si te sirve de información los filtros en kibana aparecen con un ckeck en el "index" pero no en "analyzed"

La ip deberia de aparecer, ya que el output deberia de ser algo similar a:

{
        "message" => "10.29.0.57 - - [05/Feb/2012:17:11:55 +0000] \"GET / HTTP/1.1\" 200 140 \"-\" \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.5 Safari/535.19\"",
       "@version" => "1",
     "@timestamp" => "2015-09-17T12:35:43.909Z",
           "host" => "Gabriels-MacBook-Pro.local",
       "clientip" => "10.29.0.57",
          "ident" => "-",
           "auth" => "-",
      "timestamp" => "05/Feb/2012:17:11:55 +0000",
           "verb" => "GET",
        "request" => "/",
    "httpversion" => "1.1",
       "response" => "200",
          "bytes" => "140",
       "referrer" => "\"-\"",
          "agent" => "\"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.5 Safari/535.19\""
}

Lo que no deberia de aparecer, son las coordenadas.

No me queda claro tu segunda consulta:

Otra pregunta, ¿es obligatorio tener configurado el modulo para geoip en apache? entiendo que no ya que esto va por otro lado aunque si que coja la ip de los logs de apache, debería contrastarlo con la base de datos de GEOIP.

En realidad una IP privada nunca va a ser interpretada por la base de datos de GEOIp porque no va a saber donde esta hubicada. Quiere decir que cuanto utilizas GeoIps o bien pasas la ip publica, o sino no hay otra manera que utilizar simplemente el clientip en tu caso, que contiene la ip de donde estos logs estan viniendo. Yo diria que el client up deberia de estar presente en kibana funcione o no esto.

Saludos!

--Gabriel

Por fin!! quitando los field y los mutate en logstash de la parte de geoip y borrando el "index" nuevamente y volviendolo a crear ahora sí me aparecen los filtros correctos en kibana:

tgeoip.continent_code --
geoip.country_code 0
tgeoip.country_code2 --
tgeoip.country_code3 --
tgeoip.country_name N/A
geoip.ip 10.29.0.57

Eso sí, tuve que crear mi propio template para cambiar el "type" de client ip de string a "ip" sino no funcionaba, muchas muchas gracias gmoskovicz, si te parece podria poner por aquí como he configurado el template y demás que no hay nada en castellano y es "algo" confuso.

No es nada. Un placer ayudarte.

Por favor, si puedes incluye una descripcion de lo que te sucedia asi otros usuarios podrian verlo en un futuro.

Gracias y Saludos,

--Gabriel