42
開開開開開開開開開開開開 Redmine 開開開開開開開開開 2016/11/26 redmine.tokyo 開 11 開開開開 Ryou Soda

開発環境の認証を改善して Redmineを社内標準にした話

Embed Size (px)

Citation preview

Page 1: 開発環境の認証を改善して Redmineを社内標準にした話

開発環境の認証を改善してRedmine を社内標準にした話

2016/11/26 redmine.tokyo 第 11 回勉強会Ryou Soda  

Page 2: 開発環境の認証を改善して Redmineを社内標準にした話

• 自己紹介

• 弊社の Redmine 環境

• 以前の開発環境

• LDAP+ AD認証環境構築• 動作確認

• 現在の開発環境

• おわりに

目次

Page 3: 開発環境の認証を改善して Redmineを社内標準にした話

蘇田 亮(ソダ リョウ)  @ryouma_nagare札幌に本社があるシステム開発ベンダーの東京事業所に勤務。

Linux 歴は FM-TOWNS から始まり 20 年を越えました。好きなディストリビューションはVineLinux 。

サーバ/ DB 系が得意。オープン系の Web アプリの基盤/設計がメインでしたが、1年ほど前にインフラ系の部署に強引に異動。運用/監視業務は嫌いですが、基盤を作るのは好きです。

Redmine 歴は 4 年ぐらい。

趣味はポケコン、 Palm などの古いガジェット収集。

自己紹介

Page 4: 開発環境の認証を改善して Redmineを社内標準にした話

弊社の Redmine 環境

Page 5: 開発環境の認証を改善して Redmineを社内標準にした話

4 コア/8 GB の仮想サーバで運用中

その他にテスト用として 3.2 、 3.3 の計3インスタンスを運用中。個人的な好みで、 unicorn + nginxで動かしています。

CentOS7.2 + Redmine2.6 がメイン

Page 6: 開発環境の認証を改善して Redmineを社内標準にした話

→ 標準のガントチャートにはもう戻れません

LycheeREDMINE を導入しています

Page 7: 開発環境の認証を改善して Redmineを社内標準にした話

使い方の例 - 工数管理

→WorkTime プラグインにお世話になりっぱなし

案件の掛け持ちや間接稼働が多い部署のため、

• 工数管理専用のプロジェクトを作成• 案件=チケットとして工数入力しています。

Page 8: 開発環境の認証を改善して Redmineを社内標準にした話

使い方の例 - パートナー社員の契約管理

社外常駐者もいるため、全員の契約状況把握のために

• バージョン=会社名、親チケット=人名、子チケット=1契約• 開始日~期日=契約期間• カテゴリ=契約のステータスとして管理しています。

Page 9: 開発環境の認証を改善して Redmineを社内標準にした話

最近、ラズパイ3にも入れましたRedmine3.3 をPassenger + Apache で動かしています。Zabbix のアラートの他、リポジトリのコミット時に LEDを点滅させて遊んでいます。

実用性は求めていませんw

Page 10: 開発環境の認証を改善して Redmineを社内標準にした話

以前の開発環境

Page 11: 開発環境の認証を改善して Redmineを社内標準にした話

社員数の都合上、プロジェクトはパートナー社員を含めた体制で進めることが多いが、受入時に会社がするのは、

統括会社へ申請して社員 ID 発行メールアドレス発行NW 検疫のアカウント発行で全て。

会社がすること

→ 統括会社の AD には登録されるらしいが、開発環境からは見えない

Page 12: 開発環境の認証を改善して Redmineを社内標準にした話

VPN

ファイルサーバ

社員アカウントだけ

各種開発サーバ等

リポジトリ、 BTS などすべてローカル認証。

ID は社員番号、メアドなどバラバラ…

当然、こんな状況に

Page 13: 開発環境の認証を改善して Redmineを社内標準にした話

社員アカウント

自前で LDAP を構築してパートナー社員アカウント

を登録

とりあえず自分のプロジェクトだけでも

Page 14: 開発環境の認証を改善して Redmineを社内標準にした話

→Apache 、 subversion等が対応できない。

だが、参照先が2つなのは不便

Page 15: 開発環境の認証を改善して Redmineを社内標準にした話

→LDAP をエンドポイントとして両方引くしかない!

社員アカウントパートナー社員アカウント

解決するには

Page 16: 開発環境の認証を改善して Redmineを社内標準にした話

LDAP+ AD認証環境構築

Page 17: 開発環境の認証を改善して Redmineを社内標準にした話

一つのツリーに見せかけるため、 LDAP を AD のサブドメインとして定義。

AD: dc=ZZZ,dc=localユーザ DN: cn=[漢字フルネーム ],OU=OU_Users,dc=ZZZ,dc=local  という超セン

スのない定義。

LDAP: dc=YYY,dc=ZZZ,dc=local

ドメイン定義

Page 18: 開発環境の認証を改善して Redmineを社内標準にした話

自分のアカウントで AD を検索すると、パスワード変更のたびに LDAP の設定変更が必要になってしまうので、

パスワード期限なし検索権限のみの AD アカウントを要求。

検索用アカウントを作成

→ 裏から手を回した。 AD の管理者に直接交渉。

  社内で協力してもらったのはこれだけ。

Page 19: 開発環境の認証を改善して Redmineを社内標準にした話

日本語での情報が見あたらず、たどり着いた Linuxtopia のページと、

最終的には OpenLDAP の関連ファイルを man する

ことで必要な情報を得た。

検索ワード: "Linuxtopia LDAP Administration Chaining"

情報の入手

→ 最初から標準ドキュメントを見るべきでした

Page 20: 開発環境の認証を改善して Redmineを社内標準にした話

→ ログイン名属性は AD に合わせるしかない

ActiveDirectory OpenLDAP

問題: AD と LDAP の属性差異

Page 21: 開発環境の認証を改善して Redmineを社内標準にした話

# OpenLDAP User schema

objectclass ( 1.1.2.2.1

NAME 'PartnerObject'

DESC 'Partner Object'

SUP 'inetOrgPerson'

STRUCTURAL

MUST ( sAMAccountName ) )

→sAMAccountName に uid と同じ値をセットする。  ※ AD のスキーマ定義も LDAP に登録する必要があります。

解決策: inetOrgPerson スキーマを拡張

DN のフォーマットは

sAMAccountName=[ アカウント名 ],ou=[ 会社名 ],ou=partner,dc=YYY,dc=ZZZ,dc=local

Page 22: 開発環境の認証を改善して Redmineを社内標準にした話

ActiveDirectory OpenLDAP

社員アカウント

パートナー社員アカウント

問題:ツリーを一つに見せる必要がある

Page 23: 開発環境の認証を改善して Redmineを社内標準にした話

dn: ou=XXX,dc=YYY,dc=ZZZ,dc=localchangetype: addobjectClass: topobjectClass: organizationalUnitou: XXX

dn: cn=proxy,ou=XXX,dc=YYY,dc=ZZZ,dc=localobjectClass: referralobjectClass: extensibleObjectdc: AAATreecn: proxyref: ldap://[AD の IP]/ou=OU_Users,dc=YYY,dc=local

解決策: referral オブジェクトを作成

Page 24: 開発環境の認証を改善して Redmineを社内標準にした話

OpenLDAP ActiveDirectory

見えた

Page 25: 開発環境の認証を改善して Redmineを社内標準にした話

chain-uri "ldap://[AD の IP]/"chain-rebind-as-user truechain-idassert-bind bindmethod="simple" binddn="[AD 検索ユーザーの DN]" credentials="[ パスワード ] " mode="legacy" flags="non-prescriptive"chain-acl-bind bindmethod="simple" binddn="[AD 検索ユーザーの DN]" credentials="[ パスワード ]"

AD 検索アカウントの DN

slapd.conf ー referral をたどる

Page 26: 開発環境の認証を改善して Redmineを社内標準にした話

# For Proxydatabase ldapchase-referrals nosuffix "dc=ZZZ,dc=local"uri ldap://[AD の IP]/acl-bind bindmethod="simple" binddn="[AD 検索ユーザーの DN]" credentials="[ パスワード ] "idassert-bind bindmethod="simple" binddn="[AD 検索ユーザーの DN]" credentials="[ パスワード ]" mode="legacy" flags="non-prescriptive"

AD のドメインがサーチベースの場合、AD のみを検索する

slapd.conf ー LDAP をプロキシとして AD 検索

Page 27: 開発環境の認証を改善して Redmineを社内標準にした話

動作確認

Page 28: 開発環境の認証を改善して Redmineを社内標準にした話

$ ldapsearch -x -h [LDAPの IP] -D "[LDAP検索ユーザーの DN]" -w'[パスワード ]' \ -b "dc=YYY,dc=ZZZ,dc=local" \ "(sAMAccountName=[社員 ID])" \ "sAMAccountName" "mail"

dn:: Y2496JiH55Sw5LquLG91PU9VX1VzZXJzLGRjPXRhZHMsZGM9bG9jYWw=sAMAccountName: [社員 ID]mail: [社員のメアド ]@ZZZ.co.jp

検索結果あり

LDAP のサブドメインで社員アカウント検索

Page 29: 開発環境の認証を改善して Redmineを社内標準にした話

$ ldapsearch -x -h [LDAPの IP] -D "[LDAP検索ユーザーの DN]" -w'[パスワード ]' \ -b "dc=YYY,dc=ZZZ,dc=local" \ "(sAMAccountName=[パートナー ID])" \ "sAMAccountName" "mail"

dn: sAMAccountName=[パートナー ID],ou=[会社名 ],ou=partner,dc=YYY,dc=ZZZ,dc=localsAMAccountName: [パートナー ID]mail: [パートナーのメアド ]@ZZZ.co.jp

LDAP のサブドメインでパートナーアカウント検索

検索結果あり

Page 30: 開発環境の認証を改善して Redmineを社内標準にした話

$ ldapsearch -x -h [LDAPの IP] -D "[LDAP検索ユーザーの DN]" -w'[パスワード ]' \ -b "dc=ZZZ,dc=local" \ "(sAMAccountName=[社員 ID])" \ "sAMAccountName" "mail"

dn:: Y2496JiH55Sw5LquLG91PU9VX1VzZXJzLGRjPXRhZHMsZGM9bG9jYWw=sAMAccountName: [社員 ID]mail: [社員のメアド ]@ZZZ.co.jp

AD のドメインで社員アカウント検索

検索結果あり

Page 31: 開発環境の認証を改善して Redmineを社内標準にした話

$ ldapsearch -x -h [LDAPの IP] -D "[LDAP検索ユーザーの DN]" -w'[パスワード ]' \ -b "dc=ZZZ,dc=local" \ "(sAMAccountName=[パートナー ID])" \ "sAMAccountName" "mail"

→ すべて希望通りの結果

AD のドメインでパートナーアカウント検索

検索結果なし

Page 32: 開発環境の認証を改善して Redmineを社内標準にした話

現在の開発環境

Page 33: 開発環境の認証を改善して Redmineを社内標準にした話

参照先が一つになったので

Page 34: 開発環境の認証を改善して Redmineを社内標準にした話

周辺のツールが相乗り可能に

Page 35: 開発環境の認証を改善して Redmineを社内標準にした話

subversion  -  SASL経由で LDAP 認証

GitBucket   - デフォルトで LDAP対応Apache  -  mod_authz_ldap で BASIC 認証のデータソースを LDAP

Let‘s Chat -  LDAP対応の OSS チャット

WordPress  -  LDAP でセルフサインアップを可能に

phpLDAPadmin - 受入部署やパートナー自身の管理用 GUI

周辺ツール

→LDAP に対応しないツールは基本的に使わない

  ようになった

Page 36: 開発環境の認証を改善して Redmineを社内標準にした話

おわりに

Page 37: 開発環境の認証を改善して Redmineを社内標準にした話

自分が使っていた Redmine をベースとして社内標準にした。

アカウント統一によって Redmine のリポジトリ設定でマッピングが不要になった。

パートナー社員受入時のワークフローに LDAP アカウント作成が組み込まれた。 ただし、各 PJ の申告次第

phpLDAPadmin を提供したことでアカウントのメンテナンスから解放された。 パスワード忘れは事務方で対応

チャット、社内向けの技術系ブログを始めたことで、情報がやりとりしやすくなった。 ローカルアカウントを作成しなくてよくなったので、参加のハードルが下がった Redmine のメンテナンス周知や、技術的な問い合わせがスピードアップ

よかったこと

→ 自分にとってはメリットがいっぱいあったが、

Page 38: 開発環境の認証を改善して Redmineを社内標準にした話

Redmine をうまく活用できずに、炎上プロジェクトが発生。

野良 Redmine 、野良リポジトリは相変わらず LDAP を使ってくれない。 社内共通の subversion もローカル認証のまま…

LDAP で参加のハードルを下げてもログインのみにとどまる社員が多い。 チャットも ROM 専が多い

30代半ば~後半くらいのリーダークラスが従来のやり方を変えることに消極的。 若手の社員はあまり抵抗がない

現在の問題

→周囲にはそれほどでもなかったらしい。

Page 39: 開発環境の認証を改善して Redmineを社内標準にした話

LDAP を導入することで、ログインのハードルは下がったが、なかなかアクティブになってくれない。

もともとアクティブだった社員はよりアクティブになったので、温度差が広がってしまった。

今後は Redmine を中心にアクティブな社員を増やすべく、行動を解析していきたいが、そこまで努力する必要があるか?と考えてしまって、だいぶ心が折れています…

反省

Page 40: 開発環境の認証を改善して Redmineを社内標準にした話

監視中

→ アクティブでない社員の解析はできないので、単なる趣味…

Page 41: 開発環境の認証を改善して Redmineを社内標準にした話

手順/設定等は Qiita で

http://qiita.com/ryouma_nagare/items/bcda4c372347ed83fe7c

Page 42: 開発環境の認証を改善して Redmineを社内標準にした話

ご静聴ありがとうございました