elastic / elastic/logstash

LDAP search input plugin

Open
#2,523 16 comments 0 reactions 0 assignees View on GitHub
new plugin
Dominant language
Java
Stars
14.9k
Forks
3.5k
Avg merge
19h 14m
Merged PRs (30d)
63

Description

Migrated from: https://logstash.jira.com/browse/LOGSTASH-1772

```
Hello,
I had to create an LDAP search input plugin for my personal needs (in order to monitor changes of a group). I share it there in case it can help somebody.
You just have to add this line to logstash.gemspec:
gem.add_runtime_dependency "jruby-ldap", "~>0.0.2"
```

``` ruby
# encoding: utf-8
require "logstash/inputs/base"
require "logstash/namespace"
require "socket"

# Perform an LDAP Search
#
# Example:
#
# input {
# LDAPSearch {
# host => "myLDAPServer"
# dn => "myDN"
# password => "myPassword"
# filter => "CN=HR Group"
# base => "OU=Europe,o=Acme"
# interval => 10
# }
# }
class LogStash::Inputs::LDAPSearch < LogStash::Inputs::Base

config_name "LDAPSearch"
milestone 1

# LDAP parameters
config :host, :validate => :string, :required => true
config :dn, :validate => :string, :required => true
config :password, :validate => :password, :required => true
config :filter, :validate => :string, :required => true
config :base, :validate => :string, :required => true
config :port, :validate => :number, :default => 389
# Polling interval
config :interval, :validate => :number, :default => 10

public
def register
require "base64"
require "ldap"
end # def rbgister

public
def run(queue)

@host = Socket.gethostbyname(@host).first
conn = LDAP::Conn.new(@host, @port)
conn.bind(@dn, @password.value)

begin
@logger.debug("Executing LDAP search base='#{@base}' filter='#{@filter}'")
loop do
conn.search(@base, LDAP::LDAP_SCOPE_SUBTREE, @filter) { |entry|
event = LogStash::Event.new
event["host"] = @host
decorate(event)
entry.get_attributes.each do |attr|
values = entry.get_values(attr)
values = values.map { |value|
(/[^[:print:]]/ =~ value).nil? ? value : Base64.strict_encode64(value)
}
event[attr] = values
end
queue << event
}
sleep @interval
end # loop
rescue LDAP::ResultError => ex
logger.error("LDAP search error: #{ex}\n#{ex.backtrace}")
sleep @interval
retry
end # begin/rescue
end # def run
end # class LogStash::Inputs::LDAPSearch
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.