2017年8月20日日曜日

Ruby で ldap を使ってみる

概要

Ruby に net-ldap というライブラリがあり、これを使うと Ruby から ldap の操作ができます
今回は初期設定と接続まで行ってみました
ldap サーバの構築に関しては過去の記事を元にしています

環境

  • CentOS 7.3.1611
  • openldap 2.4.40
  • Ruby 2.3.1p112
  • net-ldap 0.16.0

事前準備

過去の ldap 構築記事で admin のパスワード設定、基本スキーマの登録、dc の登録、 ou の登録までは手動で済ませておいてください
もしかするとこれも Ruby から出来るかもですが今回は触れません

ライブラリインストール

  • bundle init
  • vim Gemfile
gem "net-ldap"
  • bundle install --path vendor/bundle

ldap に接続する

  • vim connect.rb
require 'net/ldap'
require 'pp'

PORT = 389
HOST = '192.168.100.5'
BASE = 'dc=example,dc=com'
AUTH = {
  :method => :simple,
  :username => "cn=Manager,#{BASE}",
  :password => 'password'
}

ldap = Net::LDAP.new(
  host: HOST,
  port: PORT,
  base: BASE,
  auth: AUTH
)

raise 'bind failed' unless ldap.bind

ldap は SSL を使っていないので 389 を指定します
HOST の部分は ldap サーバの IP または URL を入力してください

  • bundle exec ruby connect.rb

でエラーがでなければ OK です

グループを操作してみる

せっかくなのでもう少し操作してみます
まずグループを追加してみましょう
先ほどの接続ロジック後に以下を記載してください

  • group_add.rb
dn = "cn=group1,ou=Group,#{BASE}"
attr = {
  :cn => 'group1',
  :objectClass => 'posixGroup',
  :gidNumber => '1000'
}
ldap.add(
  :dn => dn,
  :attributes => attr
)
pp ldap.get_operation_result

これで #<OpenStruct extended_response=nil, code=0, error_message="", matched_dn="", message="Success"> と表示されれば OK です
作成されたグループ名は group1 になり、ou=Group に属しています

最後の get_operation_result は結構便利でエラーの場合、詳細が見れるのでこれで確認すると良いと思います

そしたらグループの一覧を取得してみましょう

  • group_search.rb
groups = ldap.search(base: "ou=Group,#{BASE}")
pp groups

で以下のように表示されれば OK です

[#<Net::LDAP::Entry:0x000000023d3ec8
  @myhash=
   {:dn=>["ou=Group,dc=example,dc=com"],
    :objectclass=>["organizationalUnit"],
    :ou=>["Group"]}>,
 #<Net::LDAP::Entry:0x000000023d3130
  @myhash=
   {:dn=>["cn=group1,ou=Group,dc=example,dc=com"],
    :cn=>["group1"],
    :objectclass=>["posixGroup"],
    :gidnumber=>["1000"]}>]

あるグループだけ取得したい場合は以下のようにします

groups = ldap.search(base: "ou=Group,#{BASE}")

最後に

Ruby から ldap が操作できる net-ldap を使ってみました
ldap 自体クセが強いのでまずそれに慣れることからかなと思います

登録系に関しては ldif のフォーマットをそのまま Ruby のハッシュに落とし込んで実行するだけという感じです
取得系に関しては面倒くさいコマンドを発行する必要がなく取得できるのはうれしいです
ただ、クエリというか検索の条件は ldap のフォーマットを使わないといけないのが残念なところです

他の ldap 用のライブラリもあるのでそれを使えばもう少し簡単に使えるやつもあるかもしれません

参考サイト

0 件のコメント:

コメントを投稿