2017年7月22日土曜日

Harbor で ldap 認証を試してみた

概要

前回 CentOS 上に LDAP サーバを構築しました
Harbor には LDAP 認証と連携する機能があります
せっかくなので Harbor の LDAP 連携機能を使ってみました

環境

  • サーバ側
    • CentOS 7.3.1611
    • openldap (servers, clients) 2.4.40-13
  • クライアント側
    • Harbor 1.1.2
    • docker 17.03.1-ce
    • docker-compose 1.13.0

ldap を有効にする

今回は既存の Harbor 環境に対して ldap をあとから追加します

  • vim harbor.cfg
ldap_url = ldap://192.168.10.1:389/
ldap_basedn = ou=People,dc=example,dc=com
  • docker-compose down
  • docker rmi $(docker images -q)
  • docker volume rm $(docker volume ls -q)
  • rm -rf /data
  • ./install.sh

ポイントはデータボリュームと /data を削除することです
そうしないと昔のデータを参照してしまい認証モードがずっと db_auth になってしまいます

動作確認

まずは admin ユーザで Harbor にログインします
そして、 Configuration -> Authentication で Auth Mode が「LDAP」になっていることを確認します
harbor_ldap.png

「LDAP Search Password」は自動で入力されていました
下に「TEST LDAP SERVER」というボタンがあるのでここをクリックして「Connection to LDAP server is verified. 」なることを確認します
もし失敗する場合は FW や ldap サーバの設定を確認してください

確認できたら ldap に登録したユーザでログインできるか確認してみましょう
一旦 admin ユーザでログアウトして別ユーザでログインします

問題なく ldap ユーザでログインできれば連携は成功です

最後に docker login もできるか確認してみましょう
同じく ldap ユーザでログインできるのが確認できると思います

最後に

Harbor の ldap 機能を試してみました
ldap サーバ側はかなり単純な設定なので、Harbor 側も設定する項目が少なく簡単にできました
ユーザ管理が断然楽になるので ldap がある環境であればこっちを使うほうが良いと思います

2017年7月21日金曜日

OpenLDAP と SSH 認証を連携してみた

概要

前回 CentOS 上に構築した LDAP サーバを今回は SSH の認証として使ってみたいと思います

環境

  • サーバ側
    • CentOS 7.3.1611
    • openldap (servers, clients) 2.4.40-13
  • クライアント側
    • Ubuntu 16.04
    • ldap-auth-client 0.5.3
    • nscd 2.23-0ubuntu9

必要なライブラリのインストール

  • apt install -y nscd ldap-auth-client

でインストールすると ldap サーバの設定をいろいろと聞かれます
今回は前回の設定をそのまま使うので以下のように回答しました
ldap サーバの IP やポート、cn, dc は各自で設定したものを記載してください

  • ldap://192.168.10.1:389
  • dc=example,dc=com
  • Protocol version: 3
  • Yes と回答
  • No と回答
  • cn=Manager,dc=example,dc=com
  • パスワードを設定します (たぶん ldap の設定を変更する際の root ユーザ以外に求められるパスワードです)

再度設定したい場合は dpkg-reconfigure ldap-auth-config コマンドを実行してください

pam の設定

  • pam-auth-update

これまた CUI での設定画面になります
項目内に「LDAP Authentication」と「Create home directory on login」があると思うのでそれぞれチェックをして有効にしてください

nsswitch.conf の設定

ldap を認証に使うように設定します

  • vim /etc/nsswitch.conf
passwd:         compat ldap
group:          compat ldap
shadow:         compat ldap

そして nscd を再起動します

  • systemctl restart nscd

おまけ: sshd の設定の確認

sshd の設定でパスワード認証がそもそも ON になっていない場合は ON にしましょう
また鍵認証のみが ON になっている場合は OFF にしておきます

  • vim /etc/ssh/sshd_config
PubkeyAuthentication no
PasswordAuthentication yes
  • systemctl restart sshd

動作確認

では動作確認です
設定したサーバに LDAP 上に作成したユーザで SSH ログインできるか確認してみましょう

  • ssh hawk@192.168.10.2

前回作成した hawk さんでログインできることを確認しました
また、ログイン後にホームディレクトリがあり、ログインシェルが bash になっていることも確認しました

hawk@ubuntu:~$ id
uid=1001(hawk) gid=1000(develop) groups=1000(develop)
hawk@ubuntu:~$ pwd
/home/hawk
hawk@ubuntu:~$ echo $BASH
/bin/bash

最後に

OpenLDAP と SSH の連携をしてみました
今回は nscd (Name Service Cache Daemon) というツールを使いましたが他にも sssd (System Security Services Daemon) というツールがあります
最近だと sssd を使うほうが主流らしいです

参考サイト

2017年7月20日木曜日

CentOS7 で OpenLDAP を試してみた

概要

CentOS7 に OpenLDAP をインストールしてグループの追加とユーザの追加までやってみました
結構クセのある操作なので慣れるまで大変かもしれません

環境

  • CentOS 7.3.1611
  • openldap (servers, clients) 2.4.40-13

インストール

  • yum -y install openldap openldap-clients openldap-servers

作業用ディレクトリの作成

OpenLDAP では .ldif というファイルを手動で作成してそれをコマンドで追加することで設定を反映させます
ldif ファイルを作成するディレクトリを作成しておきます

  • cd
  • mkdir ldap_work

設定と起動

データベース用の設定ファイルをコピーしてから起動します

  • cp -p /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
  • systemctl start slapd

admin 用の LDAP パスワードを設定

まずは admin 用のパスワードを登録します
このパスワードは設定を反映させるときに使うので忘れないようにしてください

  • slappasswd

でパスワードを入力して以下のようなハッシュが表示されれば OK です

{SSHA}Gtys4HSlB4NAbEY+/524hxN+Lcr60z7K

まだこの状態ではパスワードは LDAP に反映されていません
冒頭述べたように LDAP への設定の反映は基本的に .ldif ファイルを作成して ldapadd で反映します

  • touch ldap_work/add_admin_pass.ldif
  • vim ldap_work/add_admin_pass.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}Gtys4HSlB4NAbEY+/524hxN+Lcr60z7K

すべてがおまじないのような文法です
dn は識別子のことで「Distinguished Name」の略です
OpenLDAP では設定の追加や削除をするのに、この dn を使って重複や削除する項目を判断します

  • ldapadd -Y EXTERNAL -H ldapi:// -f ldap_work/add_admin_pass.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={0}config,cn=config"

作成した ldif ファイルの設定の追加は ldapadd コマンドを使います
-Y EXTERNAL -H ldapi:// のオプションにしてはおまじないだと思ってください
パスワードの登録は OpenLDAP が持つグローバルな設定に対して追加するのでその場合にこのオプションが必要になります
これでパスワードの登録が完了しました

基本スキーマの登録

グループの登録をするときに必要になるクラスがあるので登録します
インストール時に用意されている ldif ファイルがあるのでそれを ldapadd していきます

  • ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
  • ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
  • ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif

Domain Component (dc) の変更

ここからがメインの設定になります
dc は「Domain Component」の略で ldap 内で管理されるドメインになります
今回は example.com をドメインとして登録します
もちろんダミーのドメインですがダミーでも問題ありません

  • touch ldap_work/modify_dc.ldif
  • vim ldap_work/modify_dc.ldif
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"
  read by dn.base="cn=Manager,dc=example,dc=com" read by * none

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=example,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=example,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}Gtys4HSlB4NAbEY+/524hxN+Lcr60z7K

自分もよくわかってないのですが、上から

  • monitor というスキーマへ権限情報の変更
  • hdb というスキーマへ olcSuffix の変更
  • hdb というスキーマへ olcRootDN の変更
  • hdb というスキーマへ olcRootPW の変更

をそれぞれ行っています
上記 dc=example,dc=com の部分を書き換えれば別のドメインを設定することができます

設定の変更は ldapmodify コマンドを使って行います

  • ldapmodify -x -D cn=config -W -f ldap_work/modify_dc.ldif

を実行して変更を反映しましょう
先程登録した admin 用のパスワードを入力してください (slappasswd で設定したパスワード)
「-w」オプションを使用すれば引数でパスワードを指定することもできますが「-W」を使って入力したほうが良いと思います

modifying entry "olcDatabase={1}monitor,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"

こんな感じで反映されれば OK です
反映後の実体のファイルは /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}hdb.ldif などにあるので確認してみると良いと思います

Organization Unit (ou) の登録

登録したドメインに今度は ou (組織) を登録していきます
この組織の中にグループやユーザを登録することになります
グループやユーザを管理する上位の概念になるのでそれっぽい名前を付けましょう

  • touch ldap_work/add_ou.ldif
  • vim ldap_work/add_ou.ldif
dn: dc=example,dc=com
objectClass: dcObject
objectClass: organization
dc: example
o: Example Inc.

dn: ou=People,dc=example,dc=com
objectClass: organizationalUnit
ou: People

dn: ou=Group,dc=example,dc=com
objectClass: organizationalUnit
ou: Group

今回は People (ユーザを管理する組織) と Group (グループを管理する組織) を作成しました
追加なので ldapadd コマンドを使って登録します

  • ldapadd -x -D “cn=Manager,dc=example,dc=com” -W -f ldap_work/add_ou.ldif
adding new entry "dc=example,dc=com"
adding new entry "ou=People,dc=example,dc=com"
adding new entry "ou=Group,dc=example,dc=com"

グループの追加

Group ou 内にグループを作成していきます

  • touch ldap_work/add_group.ldif
  • vim ldap_work/add_group.ldif
dn: cn=develop,ou=Group,dc=example,dc=com
objectClass: posixGroup
cn: develop
gidNumber: 1000

cn に追加するグループ名を設定することができます
今回は cn=develop としました
ちなみにここで設定したグループ名は後に連携する SSH 認証のログイン後に id コマンドなどで確認できるグループ名になります

あとは ldapadd で追加すれば OK です

  • ldapadd -x -D “cn=Manager,dc=example,dc=com” -W -f ldap_work/add_group.ldif

ユーザの追加

最後にユーザを追加しましょう
ユーザは People 組織配下に作成します
同時に初期パスワードも設定する必要があるので slappasswd でハッシュ値を生成します

  • slappasswd -h ‘{CRYPT}’
    • パスワードを入力してハッシュ値を取得しておきます
    • {CRYPT}vUOIOBK7ku0LU
  • touch ldap_work/add_user.ldif
  • vim ldap_work/add_user.ldif
dn: uid=hawk,ou=People,dc=example,dc=com
objectclass: posixAccount
objectclass: inetOrgPerson
sn: hawk
cn: snowlog
displayName: hawksnowlog
uid: hawk
uidNumber: 1001
gidNumber: 1000
homeDirectory: /home/hawk
loginShell: /bin/bash
userPassword: {CRYPT}vUOIOBK7ku0LU
mail: hawk@hawksnowlog.cf

hawk さんを登録します
グループとの紐付けは gidNumber で行います
slappassword で作成したパスワードは userPassword に設定します
ログインしたときにホームディレクトリを作成しデフォルトで使用するログインシェルを指定しています
あとは ldapadd で追加すれば OK です

  • ldapadd -x -D “cn=Manager,dc=example,dc=com” -W -f ldap_work/add_user.ldif

確認してみる

作成したグループとユーザ情報を ldapsearch コマンドで確認してみます

  • ldapsearch -x -LLL -D “cn=Manager,dc=example,dc=com” -W -b “ou=Group,dc=example,dc=com”
  • ldapsearch -x -LLL -D “cn=Manager,dc=example,dc=com” -W -b “ou=People,dc=example,dc=com”

Group 配下と People 配下に登録したグループとユーザが存在するのが確認できると思います

最後に

CentOS7 上に LDAP サーバを構築してみました
これだけだとタダのユーザ管理にしか使えないので次回は SSH と連携して認証管理までやらせてみようと思います

Tips

作成したユーザを作成した場合は以下のコマンドで削除できます

  • ldapdelete -x -D “cn=Manager,dc=example,dc=com” -W “uid=hawk,ou=People,dc=example,dc=com”

cn=config 配下の設定をすべて表示します

  • ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=config

参考サイト

2017年7月18日火曜日

Ruby から docker を操作する

概要

Ruby から docker API をコールしてみました

環境

  • CentOS 7.3.1611
  • docker 17.03.1-ce
  • Ruby 2.3.3p222

dockerd を tcp で通信できるようにする

事前に dockerd の設定を変更する必要があります
過去に紹介した記事があるのでこちらを参考に dockerd の設定を変更してください

ライブラリインストール

  • bundle init
  • vim Gemfile
gem "docker-api"
gem "pp"
  • bundle install

とりあえずバージョンを表示してみる

  • touch docker.rb
  • vim docker.rb
require 'docker'
require 'pp'

Docker.url = 'tcp://0.0.0.0:2376'
pp Docker.version
  • bundle exec ruby docker.rb
{"Version"=>"17.03.1-ce",
 "ApiVersion"=>"1.27",
 "MinAPIVersion"=>"1.12",
 "GitCommit"=>"c6d412e",
 "GoVersion"=>"go1.7.5",
 "Os"=>"linux",
 "Arch"=>"amd64",
 "KernelVersion"=>"4.9.4-1.el7.elrepo.x86_64",
 "BuildTime"=>"2017-03-24T00:36:45.846383257+00:00"}

こんな感じで表示されば OK です

イメージを pull する

先程のファイルの末尾に追記していきます

  • vim docker.rb
image = Docker::Image.create('fromImage' => 'alpine:latest')
p image.info["id"]

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

"sha256:7328f6f8b41890597575cbaadc884e7386ae0acc53b747401ebce5cf0d624560"

イメージに tag 付けする

リポジトリとタグを指定してプライベートリポジトリに push する際に使います

  • vim docker.rb
tagged = image.tag('repo' => 'your-registry.com/hawksnowlog/alpine', 'tag' => 'latest', force: true)
p tagged

で以下のようにタグ付けしたイメージが追加されていれば OK です

["alpine:latest", "your-registry.com/hawksnowlog/alpine:latest"]

イメージを push する

タグ付けしたイメージを push してみます

  • vim docker.rb
Docker.authenticate!('username' => 'username', 'password' => 'password', 'serveraddress' => 'your-registry.com')
pushed = image.push(nil, repo_tag: 'your-registry.com/hawksnowlog/alpine:latest')
pp pushed

でプライベートリポジトリにイメージを push することができます

最後に

Ruby から docker を操作してみました
過去に golang でやったのですが数倍は楽にできました
その他の操作方法も Github の公式を見れば簡単にできると思います

参考サイト

2017年7月15日土曜日

Ubuntu16.04 の nginx で SSL 通信を有効にする方法

概要

Ubuntu16.04 で apt install できる nginx に SSL 証明書を設定して https 通信させてみました
Web 上に他にもいろいろと nginx + ssl の記事はありますが自分の備忘録として残しておきます

環境

  • Ubuntu 16.04
  • nginx 1.10.3

nginx のインストール

  • apt -y install nginx

今回は apt でインストールします
執筆時点での nginx の最新版は 1.13.3 なのでバージョン的にはかなり古いものになります

SSL の有効化

ディレクトリ構成などは apt install できたものをそのまま採用してます

設定ファイルの作成

まず SSL 用の設定ファイルがないので作成します

  • touch /etc/nginx/sites-available/ssl
  • vim /etc/nginx/sites-available/ssl
server {
        listen       443;
        server_name  your.site.domain.com;

        ssl                  on;
        ssl_certificate      /etc/ssl/certs/chain_server.crt;
        ssl_certificate_key  /etc/ssl/certs/server.key;

        ssl_session_timeout  5m;

        ssl_protocols  SSLv2 SSLv3 TLSv1;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers   on;

        location / {
            proxy_pass http://localhost:9292/;
            proxy_redirect default;
        }
}

server_name には 443 で受けるサーバまたはロードバランサのドメイン名を指定してください
ポイントとしては ssl_certificate の項目で nginx の場合 CA 証明書を設定する欄はなく ssl_certificate でサーバ証明書と CA 証明書を設定します
つまりどういうことかというと 2 つのファイルを結合して配置します

連結証明書の作成

  • scp server.crt server.key ca.crt server001:/etc/ssl/certs

ローカルからサーバに証明書を転送します、すでにサーバに証明書一式がある場合はこの作業は不要です
パスは「/etc/ssl/certs」に配置します

  • cd /etc/ssl/certs
  • cat server.crt ca.crt >> chain_server.crt

単純に cat で結合すれば大丈夫です

設定ファイルを有効化

Ubuntu + apt install の場合 sites-enabled に使いたい設定ファイルのシンボリックリンクを作成することで設定を追加することができます
Apache とかもこの方式を採用しています

  • cd /etc/nginx/sites-enabled
  • ln -s /etc/nginx/sites-available/ssl ssl
  • rm default
  • systemctl restart nginx

作成した ssl を sites-enabled にリンクして終了です
あとは nginx を再起動してあげましょう

動作確認

ブラウザや curl で適当にドメインにアクセスして localhost:9292 で動作してるアプリにアクセスできるか確認してください
もちろんローカルで動作しているアプリは別のものに変更して大丈夫です

最後に

Ubuntu16.04 の nginx で https 通信を設定してみました
Web 上に膨大な情報があるので簡単にセットアップできると思います

この後の Tips でも紹介していますが、地味に ufw の設定などでハマるかもしれません

Tips

もし key ファイルにパスが設定されている場合は以下のコマンドでパスフレーズがない key ファイルを作成してください
パスフレーズがあっても問題ないのは問題ないですが、systemctl で自動起動などができなくなります

  • openssl rsa -in server.key -out nopass_server.key

パスフレーズがわからない場合はさすがに証明書の管理者に聞くしかないと思います

Ubuntu の場合 ufw が効いているので 443 をオープンしましょう

  • ufw allow 443

あと curl で以下のようなエラーが出た場合は CA 証明書が適切に連結されているか確認してみてください

curl: (60) server certificate verification failed. CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none

証明書によっては CA ファイルが不要な証明書もあるのでその場合は特にエラーも出ないと思います

2017年7月14日金曜日

既存の git リポジトリを既存の Heroku アプリとして登録する方法

概要

Heroku 上には既にアプリがあって新たに clone したリポジトリを Heroku のアプリとして登録した場合の方法を紹介します
というかいつもコマンドを忘れるので備忘録として残しておきます

環境

  • macOS X 10.12.5
  • heroku-cli 6.12.8-ec1843e

方法

git リポジトリ配下に移動して以下のコマンドを実行します

  • heroku git:remote --app your-existed-app-name

で Heroku アプリを登録したら

  • git push -u heroku master

で Heroku にデプロイできます

2017年7月13日木曜日

Ubuntu16.04 (64bit) に golang 1.8.3 をインストール

概要

別の記事でちょろっとインストール方法が記載されていたりするのですが、単体の記事でポストしていなかったので備忘録として残しておきます
バージョンが上がればインストール方法が変わる可能性があるので、最新版をインストールしたい場合は参考サイトにある公式を御覧ください

環境

  • Ubuntu 16.04
  • golang 1.8.3

インストール

  • cd /tmp
  • wget ‘https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz
  • tar -C /usr/local -xzf go1.8.3.linux-amd64.tar.gz
  • mkdir $HOME/go
  • echo 'export PATH=$PATH:/usr/local/go/bin' >> $HOME/.profile
  • echo 'export GOROOT=$HOME/go' >> $HOME/.profile
  • echo 'export PATH=$PATH:$GOROOT/bin' >> $HOME/.profile
  • go version

参考サイト