メンターを任されたエンジニアのブログ

ある日メンターを任された3流エンジニアのブログ

OpenVPNのインストール - その2 サーバ設定

hatman62.hatenablog.com

ubuntu公式だとTLS認証を有効化する手順が含まれていません。
ので、その設定を含めつつ、公式ドキュメントに則って手順を書いていきたいと思います。

大体1時間くらいで終わる、、、はず。

サーバのインストール

ターミナルから以下のコマンドを実行

$ sudo apt-get install openvpn easy-rsa

公開鍵暗号基盤(PKI)のセットアップ

  1. 自前の認証局(CA)で証明書を作成
  2. その証明書を使って鍵を作成

てな感じ。

オレオレ認証局の設定

というわけで、認証局をセットアップしていきます
※ rootユーザで実施

# mkdir /etc/openvpn/easy-rsa/
# cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/

変数ファイルを修正

# cd /etc/openvpn/easy-rsa/
# cp -p vars vars.bk
# vi /etc/openvpn/easy-rsa/vars
# # 64-68行目を編集
# # 編集した差分を表示
# diff vars.bk vars
64,68c64,68
< export KEY_COUNTRY="US"
< export KEY_PROVINCE="CA"
< export KEY_CITY="SanFrancisco"
< export KEY_ORG="Fort-Funston"
< export KEY_EMAIL="me@myhost.mydomain"
---
> export KEY_COUNTRY="JP"              # <- 国
> export KEY_PROVINCE="Tokyo"          # <- 都道府県
> export KEY_CITY="CITY-NAME"          # <- 区市町村名
> export KEY_ORG="hogehoge.com"        # <- ドメイン名
> export KEY_EMAIL="example@hoge.com"  # <- メールアドレス

CA証明書と鍵を作成

# cd /etc/openvpn/easy-rsa/
# source vars
# ./clean-all
# ./build-ca
(略 とりあずEnterキー押下していればOK)
# ./build-key-server myservername

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:password #←パスワードを入力(空でもOKらしい)
(略 とりあずEnterキー押下していればOK)
Certificate is to be certified until Jul  4 13:25:38 2026 GMT (3650 days)
Sign the certificate? [y/n]:y # <- yを入力


1 out of 1 certificate requests certified, commit? [y/n]y # <- yを入力
Write out database with 1 new entries
Data Base Updated

# ./build-dh
(ちょっと時間かかる)

# cd keys
# openvpn --genkey --secret ta.key
# cp myservername.crt myservername.key ca.crt dh2048.pem ta.key /etc/openvpn/

クライアント用の証明書を作成

# cd /etc/openvpn/easy-rsa/
# source vars
# ./build-key client1
(build-key-serverの時と同じ)

この時作成される証明書とか諸々はクライアント側にコピーしておく。

※クライアント証明書とキーはコピー後に削除すること
※CA証明書(ca.crt)、TLS証明書(ta.key)は削除しないでね

# cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
# gzip -d /etc/openvpn/server.conf.gz
# vi /etc/openvpn/server.conf
(数字は行数)
 77 # (see "pkcs12" directive in man page).
 78 ca ca.crt
 79 cert myservername.crt
 80 key myservername.key  # This file should be kept secret
 81
 82 # Diffie hellman parameters.
 83 # Generate your own with:
 84 #   openssl dhparam -out dh2048.pem 2048
 85 dh dh2048.pem

243 # on the server and '1' on the clients.
244 tls-auth ta.key 0 # This file is secret

IP forwardingを有効化するため、/etc/sysctl.confの以下のコメントアウトを外す

#net.ipv4.ip_forward=1

外したら、再起動

sysctl -p /etc/sysctl.conf

確認してみる

# sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1

OpenVPNを起動する

# service openvpn@server start

@の後ろは設定ファイルの名前らしく、今回の場合、servrer.confなので、@serverをつけている

次回はクライアント側の設定について。

OpenVPNのインストール ~ その1 ~

参考記事

  • Ubuntu16.04の公式マニュアル。これをやれば動くはず。でも英語分からない

OpenVPN

  • OpenVPN構築した人のブログ記事。いつもお世話になっております。

VPNサーバー構築(OpenVPN) - Scientific Linuxで自宅サーバー構築

  • OpenVPN.jp。英語アレルギーにとってのメシア

OpenVPN.JP | OpenVPN日本語情報サイト

vpnux Client - OpenVPN client for Windows

今回の目的

メンティが手を動かす前に私が手を動かして、難易度を確かめたかった。
単純にやってみたかった。というのもある。

社内のインフラを間借りすることになり、どんだけリソース食うんだ、という調査も兼ねている。
というか、そっちが本題。

構築時間とか

大体1時間くらいで構築できた。
今回は調査が目的だったのもあって、公式ドキュメント通り、「証明書認証」を採用。
日本語ドキュメントを探したり、うだうだしてたけど、本当に簡単だった。
引っかかるポイントもなし。

ぶっちゃけ参考記事を読めば私の記事は要らないと思う。本当に。

眠いから、今日はここまで!

素人なりにNW構成を考えてみた

f:id:hatman62:20160702231644p:plain

linuxではOpenVPNっていうOSSVPNソフトがあるらしく、
こいつを使えば、セキュアな環境が作れるのではないかと思った。

  1. VPNサーバには業務に関わるものは置かない
  2. Devサーバ(開発作業基盤)は、チャットやGitLabなど今まで構築してきたサーバ
  3. VPN網に接続した端末のみ、Devサーバにアクセスできる(DevサーバのグローバルIPは外す)
  4. VPNサーバからはVPNの他、80,443ポート以外で外に出れない。(VPN->Devへのアクセス制限。22ポートだけ制限でもOKか)
  5. DevサーバはVPN網以外のIPからのアクセスを拒否

ここまでやれれば、自宅サーバでも許可降りたかなぁ。。。とか思う

アドバイスあれば、お願いします。。。。

どうしたもんかなぁ

f:id:hatman62:20160629234853j:plain

色々と自宅サーバで遊んでいたわけですが、これもメンター研修の基盤作りの一環でした。
メンター研修の目標と過程についてレビューを受けたのですが、自宅サーバのセキュリティってどうなん、という話になり。。。

この環境を手放さざるを得なくなりました。

自社に開発環境を整えるように言われてしまったぁああああああうあああああああああああああああああ

セキュリティなんて知らねぇよ、3流だもの。みつを。

自信もないから、そりゃあ、戦えないよ。
実際、確認したらFirewallの設定もなかったわけだし。

そんなわけで、自宅サーバから場所を移すことになりそうです。


気持ちを切り替えて。
本の紹介。

速習ECMAScript6: 次世代の標準JavaScriptを今すぐマスター!

速習ECMAScript6: 次世代の標準JavaScriptを今すぐマスター!

kindleストアで安かったので買いました。 Node.jsもES6に対応していることだし、勉強しとかないとなぁ、という感じで。 250円だったかな?ハズレでも懐痛くない。

そんなにページ数もないし、電車でちょこっと読むにはいいんじゃないかと。
実際に手を動かしているわけではないのですが、なんとなぁく分かる感じ。

Gitによるバージョン管理

Gitによるバージョン管理

まだ読んでいませんが。。。
実践的な使い方が書いてあるということで、期待しています。
読み終えたら記事を書きたいなぁ、と思います。

firewallの設定とか

そういえばちゃんとしてなかった。。。てへぺろ

大した情報もサーバーには入っていませんが、何があるか分からないし、
最低限設定しないといけないでしょ、そりゃあ!

というわけで設定していきます。

CentOSのminimalだとデフォルトでSSHくらいしか許可されていなかった気がするけど、
Ubuntuは違うのかな。デスクトップ版だから?

ufwコマンドを使う

  • 使用OS:Ubuntu16.04

iptablesとかよくわからない、という人向け。まさに私。

# ufw status
状態: 非アクティブ
# ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
ファイアウォールはアクティブかつシステムの起動時に有効化されます。
# ufw default DENY
デフォルトの incoming ポリシーは 'deny' に変更しました
(適用したい内容に基づいて必ずルールを更新してください)

# ufw limit OpenSSH
ルールを追加しました
ルールを追加しました (v6)
# ufw allow from 172.17.0.0/16 to any port 389
ルールを追加しました

allowを使ってもいいんだけど、limitをつけることで接続制限がかけられるんだそうな。
ちなみに、389はLDAP用のポートで、Dockerコンテナからの接続を許可するようにしています。

環境構築:GitLab+Rocket.Chat+Kanboard on Docker - GitLab編

最終的なイメージ

f:id:hatman62:20160628232742p:plain

OwnCloudについてはちょっと待ってくださいね。。。
後日構築手順をやりたいと思います(やるとは言っていない)
とりあえずGitLabまで出来たら完了でいいかな。

Gitlabとは

オンプレミスでGitリポジトリ管理ができるツール、それがGitLab。
説明間違ってたらごめんなさい。

さて、GitLabは公式なDockerイメージが用意されている上に、ちゃんとドキュメントまで用意されているので、
英語さえ読めれば簡単に構築できます。

GitLab Documentation

問題は私の英語力が中学生以下ということだ。

さて、困ったね。

docker-compose.ymlの利用

ドキュメントの通り、コマンド一つで立ち上がるんだけれど、
コンテナイメージが吹っ飛んでしまった時、もう一度同じdocker run ...を打つ必要があり、正直めんどい。

なので、1コンテナだけなんだけど、docker-compose.ymlに書いてしまう。

app:
  image: gitlab/gitlab-ce
  volumes:
    - ./data:/var/opt/gitlab
    - ./config:/etc/gitlab
    - ./logs:/var/opt/gitlab
  ports:
    - "8020:443"
    - "8010:8010"
    - "8030:22"
  restart: always
  hostname: 'hostname' #// <- ドメイン名を指定
  environment:
    GITLAB_OMNIBUS_CONFIG: |
      external_url 'http://hostname:8010' #// <- ドメイン名:ポート番号
      gitlab_rails['gitlab_shell_ssh_port'] = 8030 #// <- 使うのかわからないけど、とりあえず
      gitlab_rails['ldap_enabled'] = true
      gitlab_rails['ldap_servers'] = YAML.load <<-'EOS' # remember to close this block with 'EOS' below
        main: # 'main' is the GitLab 'provider ID' of this LDAP server
          label: 'LDAP'
          host: 'XX.XX.XXX.XXX' #// <-IPアドレスで指定
          port: 389
          uid: 'uid'
          method: 'plain' # "tls" or "ssl" or "plain"
          bind_dn: 'cn=admin,dc=hoge,dc=jp'
          password: 'passwd'
          active_directory: false #//<- OpenLdapなので
          allow_username_or_email_login: false
          block_auto_created_users: false
          base: 'dc=hoge,dc=jp'
          user_filter: ''
          attributes:
            username: ['uid']
            email:    ['mail']
            name:       'cn'
            first_name: 'givenName'
            last_name:  'sn'
      EOS

<-IPアドレスで指定 ここ、コレで詰まった。
最初はドメイン指定をしていたのだけど、それだとNG。接続エラーになってしまった。

自分自身(HostOS)だし、問題なく名前解決できると思ったんだけど、、、、

とりあえずIPアドレス指定で解決。
何か知ってる人いたら教えてほしい。。。

  volumes:
    - ./data:/var/opt/gitlab
    - ./config:/etc/gitlab
    - ./logs:/var/opt/gitlab

ここにある通り、ディレクトリを作成

# mkdir data
# mkdir config
# mkdir logs
  • data:gitのデータが入ってくる
  • config:設定ファイル
  • logs:各種ログ

あとは、docker-compose up -d で起動します。
起動に時間かかるので、焦らず待ちましょう。

docker-compose.ymlのGITLAB_OMNIBUS_CONFIGの設定が間違っていた場合

LDAPなんかね、そんな簡単に連携できねぇんだよ。
3流エンジニアなめんな。

というあなた、というか私。

./config/gitlab.rbを修正した後、Dockerコンテナを再起動しましょう

# docker-compose restart

これで修正が反映されるはずです。
私の場合、docker-compose.ymlを修正して再起動やら、コンテナ削除やらしてもうまく反映できませんでした。
configディレクトリをまっさらにしたり、試したんですけどねぇ、、、寝ぼけたかな。

スマートではないけど確実な方法ですので、お試しください。

環境構築:GitLab+Rocket.Chat+Kanboard on Docker - kanboard編

hatman62.hatenablog.com

Taigaで失敗したので、kanboardに切り替えていく。

kanboardもまた、かんばん方式のタスク管理サービスで、
使い方が分かればよさげなもの。

使い方が分かるとは言っていない。

これもDockerを使って入れていきたい。

初めに言い訳するけど、構築してから数日経ってるので、抜け漏れはあるものと思っていただきたい。

さくっと入れる

# docker run -d -it --name kanboard kanboard/kanboard

はい、おしまい。

ではない。
私はLDAPと連携させたいのだ。

なので、設定ファイルだけいただく。

# docker cp kanborad:/var/www/kanboard/config.default.php \
> config.default.php
# docker cp kanborad:/var/www/kanboard/config.php \ 
> config.php

config.default.phpを参考にLDAP設定をconfig.phpに入れる

追記分はこんな感じ

// Enable LDAP authentication (false by default)
define('LDAP_AUTH', true);

// LDAP server hostname
define('LDAP_SERVER', 'HOSTNAME');

// LDAP server port (389 by default)
define('LDAP_PORT', 389);

// By default, require certificate to be verified for ldaps:// style URL. Set to false to skip the verification
define('LDAP_SSL_VERIFY', false);

// Enable LDAP START_TLS
define('LDAP_START_TLS', false);

// By default Kanboard lowercase the ldap username to avoid duplicate users (the database is case sensitive)
// Set to true if you want to preserve the case
define('LDAP_USERNAME_CASE_SENSITIVE', false);

// LDAP bind type: "anonymous", "user" or "proxy"
define('LDAP_BIND_TYPE', 'anonymous');

// LDAP username to use with proxy mode
// LDAP username pattern to use with user mode
define('LDAP_USERNAME', null);

// LDAP password to use for proxy mode
define('LDAP_PASSWORD', null);

// LDAP DN for users
// Example for ActiveDirectory: CN=Users,DC=kanboard,DC=local
// Example for OpenLDAP: ou=People,dc=example,dc=com
define('LDAP_USER_BASE_DN', 'ou=People,dc=hoge,dc=jp');

// LDAP pattern to use when searching for a user account
// Example for ActiveDirectory: '(&(objectClass=user)(sAMAccountName=%s))'
// Example for OpenLDAP: 'uid=%s'
define('LDAP_USER_FILTER', 'uid=%s');

// LDAP attribute for username
// Example for ActiveDirectory: 'samaccountname'
// Example for OpenLDAP: 'uid'
define('LDAP_USER_ATTRIBUTE_USERNAME', 'uid');

// LDAP attribute for user full name
// Example for ActiveDirectory: 'displayname'
// Example for OpenLDAP: 'cn'
define('LDAP_USER_ATTRIBUTE_FULLNAME', 'cn');

// LDAP attribute for user email
define('LDAP_USER_ATTRIBUTE_EMAIL', 'mail');

// LDAP attribute to find groups in user profile
define('LDAP_USER_ATTRIBUTE_GROUPS', '');

// LDAP attribute for user avatar image: thumbnailPhoto or jpegPhoto
define('LDAP_USER_ATTRIBUTE_PHOTO', '');

// LDAP attribute for user language, example: 'preferredlanguage'
// Put an empty string to disable language sync
define('LDAP_USER_ATTRIBUTE_LANGUAGE', '');

// Allow automatic LDAP user creation
define('LDAP_USER_CREATION', true);

// LDAP DN for administrators
// Example: CN=Kanboard-Admins,CN=Users,DC=kanboard,DC=local
define('LDAP_GROUP_ADMIN_DN', '');

// LDAP DN for managers
// Example: CN=Kanboard Managers,CN=Users,DC=kanboard,DC=local
define('LDAP_GROUP_MANAGER_DN', '');

// Enable LDAP group provider for project permissions
// The end-user will be able to browse LDAP groups from the user interface and allow access to specified projects
define('LDAP_GROUP_PROVIDER', false);

// LDAP Base DN for groups
define('LDAP_GROUP_BASE_DN', '');

// LDAP group filter
// Example for ActiveDirectory: (&(objectClass=group)(sAMAccountName=%s*))
define('LDAP_GROUP_FILTER', '');

// LDAP user group filter
// If this filter is configured, Kanboard will search user groups in LDAP_GROUP_BASE_DN with this filter
// Example for OpenLDAP: (&(objectClass=posixGroup)(memberUid=%s))
define('LDAP_GROUP_USER_FILTER', '');

// LDAP attribute for the group name
define('LDAP_GROUP_ATTRIBUTE_NAME', 'cn');

kanboardをあげなおす

# docker rm -f kanboard
#   docker run -d --name kanboard  \
> -v `pwd`/config.php:/var/www/kanboard/config.php \
> kanboard/kanboard

あとはlocalhostに接続して、LDAPユーザで入れることを確認するだけ。