2016年5月20日金曜日

IDCFクラウドをAPIから使う(準備編)

このエントリーをはてなブックマークに追加
コストの試算を考えるとめんどくさいですけど、クラウドいいですよね。スモールスタートしながらスピード感出して構築できるし。

AWSは押さえておかないといけないですが、今のところ、仕事上、コスト計算しやすいとか大人の事情とかでIDCFクラウドを使うことが多いです。クラウドコンソールからコツコツ作るのもできるけど、せっかくのクラウドなのでAPIからサーバ構築していきたいかなと。基盤にはCloudStackを採用しているようなので、その勉強にもなるし。

ドキュメントはIDCFクラウド API/技術ドキュメントにあるので、これを参照しながら手順はほぼ写経。
gitとpipのインストール

色々と必要なものをインストールしておく。
$ apt-get install --install-suggests git python-pip
 $ apt-get install --install-suggests gcc build-essential libxml2-dev libxslt1-dev python-dev
cloudstack-apiをインストールする。
 $ pip install git+https://github.com/idcf/cloudstack-api
バージョン確認する。
 $ cloudstack-api --version
APIを利用するために設定ファイル(.idcfrc)を作成する。
 
[account]
host=${idcf_end_point}
api_key=${your_api_key}
secret_key=${secret_key}
設定ファイルが効いているか確認する。
 $ cloudstack-api listZones
こんな感じでずらずらと出てきたら成功。
{
  "listzonesresponse": {
    "count": 5,
    "zone": [
      {
        "allocationstate": "Enabled",
        "dhcpprovider": "VirtualRouter",
:
:
:
利用できるゾーンの確認。ちなみに-tは結果をテーブル形式で出力する。何もなければJSON形式で出力される。
 
$ cloudstack-api listZones -t id
+--------------------------------------+
|                  id                  |
+--------------------------------------+
| 9703cdbb-aee7-41ba-ba80-4807eaa68b80 |
| a117e75f-d02e-4074-806d-889c61261394 |
| a53ff3d3-042b-4cbd-ad16-494bb8d33e06 |
| baf86a6e-4e3b-428e-8fd0-7fda43e468d4 |
| f0954b9b-2626-4549-82ad-ca421073b3bc |
+--------------------------------------+
利用できるサーバタイプの確認
 
$ cloudstack-api listServiceOfferings -t id,displaytext
+--------------------------------------+------------------------------------+
|                  id                  |            displaytext             |
+--------------------------------------+------------------------------------+
| 10d303d6-d39f-4b15-80a1-982e86ef002b | highio.3XL128( 24CPU /128GB RAM)   |
| 12e39b73-3ce6-4e57-9036-3dac0c2b2b06 | highmem.M16( 2CPU / 16GB RAM )     |
| 354c62e6-b99b-42f2-b5c7-e741f1085422 | standard.XL32( 8CPU / 32 GB RAM )  |
| 435c1aab-e796-42c7-9320-22ebdc8f50aa | highcpu.L8( 4CPU / 8GB RAM )       |
| 55621f17-4d38-457c-ba34-e6199701b67b | standard.S4( 1CPU / 4GB RAM )      |
| 6a99ff4c-1a24-4aa6-b4cc-600220987ed0 | standard.L16( 4CPU / 16GB RAM )    |
| 6fda5e0c-e64d-46ea-893d-7e2ac9e128e7 | highcpu.XL16 ( 8CPU / 16GB RAM )   |
| 7ae143a6-5662-4f1d-bc4c-10defa775bcb | standard.M8( 2CPU / 8GB RAM )      |
| 7c548831-427b-437c-9c8b-80dde8031303 | highcpu.2XL32( 16 CPU / 32GB RAM ) |
| 8cf15770-c3c8-4efc-8ae5-b8327790db76 | highcpu.M4( 2CPU / 4GB RAM )       |
| 95edba75-7cb5-4654-a2f5-f40b7acf7a57 | standard.S8( 1CPU / 8GB RAM )      |
| 9a2f3ee4-af46-4790-9331-753674c16e68 | highio.5XL128( 40CPU /128GB RAM)   |
| d1aac6d2-bb47-4106-90d0-6a73ac3ae78e | light.S2( 1CPU / 2GB RAM )         |
| d59817bc-ed79-4083-8b71-51b26c76d311 | highmem.L32( 4CPU / 32GB RAM )     |
| e01a9f32-55c4-4c0d-9b7c-d49a3ccfd3f6 | light.S1( 1CPU / 1GB RAM )         |
| ec13a7d8-26ce-4c4e-a223-7ef832bb1243 | light.S2( 1CPU / 2GB RAM )         |
| ee5ee568-76b2-46ad-9221-c695e6f2149d | highmem.XL64( 8CPU / 64GB RAM )    |
+--------------------------------------+------------------------------------+
利用できるテンプレートの確認
 
$ cloudstack-api listTemplates --templatefilter executable -t id,ostypename
+--------------------------------------+---------------------------------------+
|                  id                  |               ostypename              |
+--------------------------------------+---------------------------------------+
| 06c0be30-95e0-4f90-9af5-aa0637974e9b | CentOS 6.4 (64-bit)                   |
| 08d914bc-c632-4179-95ca-7913aca0275e | Red Hat Enterprise Linux 6.4 (64-bit) |
| 107a7aba-0867-4fa6-927d-772944208ba9 | CentOS 6.4 (64-bit)                   |
| 180ec450-2570-4d6c-b2c0-c40316814025 | CentOS 6.4 (64-bit)                   |
| 180ec450-2570-4d6c-b2c0-c40316814025 | CentOS 6.4 (64-bit)                   |
:
:
後は作っていこう。

UbuntuにOpenVPNをインストールしてiPadから接続したい(iPad編)

このエントリーをはてなブックマークに追加
OpenVPNでiPadからVPNをつなぐ野望。その野望を叶えるために利用するのはこのアプリ。OpenVPNによるOpenVPNのためのアプリ。
このアプリにOpenVPNのクライアント設定ファイルをインポートさせるために、ovpnファイルを作る。中はこんな感じ。
tls-client
client
proto udp
dev tun0
nobind
persist-key
persist-tun
verb 3
pull
comp-lzo
reneg-sec 3600
remote (VPNサーバのIPアドレス) (VPNサーバのポート)

ns-cert-type server

key-direction 1
<ca>
-----BEGIN CERTIFICATE-----
オレオレCA証明書
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
クライアント証明書
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
クライアント認証鍵
-----END PRIVATE KEY-----
</key>
<tls-auth>
-----BEGIN OpenVPN Static key V1-----
TLS認証鍵
-----END OpenVPN Static key V1-----
</tls-auth>
これをメールでもiTunes経由でもいいのでアプリにインポートして接続するだけ!

これでiPadからVPN接続できる!

2016年5月19日木曜日

UbuntuにOpenVPNをインストールしてiPadから接続したい(サーバ設定)

このエントリーをはてなブックマークに追加
まぁ、色々と試行錯誤しなから少しずつサーバを育ているわけですが、今回はさくらVPSで動いているサーバにVPNで接続したいなと思いインストールしてみた。

ちなみに最終目標はタイトル通りiPadからVPN接続ができることです。

まずはOpenVPNのパッケージをインストール。

$ apt-get install openvpn
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  libpkcs11-helper1
提案パッケージ:
  easy-rsa
以下のパッケージが新たにインストールされます:
  libpkcs11-helper1 openvpn
アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 0 個。
462 kB のアーカイブを取得する必要があります。
この操作後に追加で 1,163 kB のディスク容量が消費されます。
続行しますか? [Y/n] y
提案されたeasy-rsaも追加でインストールする。easy-rsaをインストールする際にもpcmciautilsを提案されたので面倒くさいから--install-suggestsをつけて実行する。
$ apt-get install --install-suggests easy-rsa
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  libccid opensc opensc-pkcs11 pcmciautils pcscd
以下のパッケージが新たにインストールされます:
  easy-rsa libccid opensc opensc-pkcs11 pcmciautils pcscd
アップグレード: 0 個、新規インストール: 6 個、削除: 0 個、保留: 0 個。
1,108 kB のアーカイブを取得する必要があります。
この操作後に追加で 3,949 kB のディスク容量が消費されます。
続行しますか? [Y/n] y
この後実行する手順はこんな感じ。

  1. オレオレ認証局を作る(認証局と証明書)
  2. オレオレ認証局に認証されたサーバ証明書と秘密鍵を作成する
  3. 暗号化に使用するDiffie-Hellman用パラメータを作成する
  4. オレオレ認証局に認証されたクライアント証明書と公開鍵を作成する
  5. OpenVPNの設定・起動


1. オレオレ認証局を作る(認証局と証明書)

まずは認証局の情報を設定するために、初期設定されたディレクトリとファイルを作成する。

$ make-cadir /etc/openvpn/easy-rsa
/etc/openvpn/easy-rsa/varsの中に認証局のドメインや組織情報などを環境変数に設定してあるので編集する。
export EASY_RSA="/etc/openvpn/easy-rsa"         #設定用のホームディレクトリ

export KEY_COUNTRY="JP"
export KEY_PROVINCE="OSAKA"
export KEY_CITY="Minato-ku, Osaka"
export KEY_ORG="High Mountain"
export KEY_EMAIL="master@highmountain-lab.net"
export KEY_OU="WEB Development Dept."
環境変数を読み込み、オレオレ認証局を作成する。
$ source /etc/openvpn/easy-rsa/vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys
$ /etc/openvpn/easy-rsa/clean-all
$ /etc/openvpn/easy-rsa/build-ca
Generating a 2048 bit RSA private key
.................................................................................+++
....+++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [JP]:
State or Province Name (full name) [OSAKA]:
Locality Name (eg, city) [Minato-ku, Osaka]:
Organization Name (eg, company) [High Mountain]:
Organizational Unit Name (eg, section) [WEB Development Dept.]:
Common Name (eg, your name or your server's hostname) [High Mountain CA]:
Name [EasyRSA]:
Email Address [master@highmountain-lab.net]:
これで認証局の証明書(ca.crt)と秘密鍵(ca.key)が/etc/openvpn/easy-rsa/keys配下に作成される。


2. オレオレ認証局に認証されたサーバ証明書と秘密鍵を作成する

さっそくサーバ証明書と秘密鍵を作成しよう。
$ /etc/openvpn/easy-rsa/build-key-server LubuntuSakura
Generating a 2048 bit RSA private key
.........................................................+++
................................+++
writing new private key to 'LubuntuSakura.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [JP]:
State or Province Name (full name) [OSAKA]:
Locality Name (eg, city) [Minato-ku, Osaka]:
Organization Name (eg, company) [High Mountain]:
Organizational Unit Name (eg, section) [WEB Development Dept.]:
Common Name (eg, your name or your server's hostname) [LubuntuSakura]:
Name [EasyRSA]:
Email Address [master@highmountain-lab.net]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'JP'
stateOrProvinceName   :PRINTABLE:'OSAKA'
localityName          :PRINTABLE:'Minato-ku, Osaka'
organizationName      :PRINTABLE:'High Mountain'
organizationalUnitName:PRINTABLE:'WEB Development Dept.'
commonName            :PRINTABLE:'LubuntuSakura'
name                  :PRINTABLE:'EasyRSA'
emailAddress          :IA5STRING:'master@highmountain-lab.net'
Certificate is to be certified until May 15 18:40:00 2026 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
同じようにこれでサーバ証明書(LubuntuSakura.crt)と秘密鍵(LubuntuSakura.key)が/etc/openvpn/easy-rsa/keys配下に作成される。


3. 暗号化に使用するDiffie-Hellman用パラメータを作成する

/etc/openvpn/easy-rsa/build-dhを実行する。
$ /etc/openvpn/easy-rsa/build-dh
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
.........................................................................+...........................................................................................................+.............................................................................................................................................+.............................+......................................+...............+...................................................................................................................
鍵作成されると、/etc/openvpn/easy-rsa/keys/dh2048.pemが作成される。


4. オレオレ認証局に認証されたクライアント証明書と公開鍵を作成する

クイアント証明書と鍵を作成する。
# /etc/openvpn/easy-rsa/build-key LubuntuServerClient
Generating a 2048 bit RSA private key
...........+++
...................................................................................................+++
writing new private key to 'LubuntuServerClient.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [JP]:
State or Province Name (full name) [OSAKA]:
Locality Name (eg, city) [Minato-ku, Osaka]:
Organization Name (eg, company) [High Mountain]:
Organizational Unit Name (eg, section) [WEB Development Dept.]:
Common Name (eg, your name or your server's hostname) [LubuntuServerClient]:
Name [EasyRSA]:
Email Address [master@highmountain-lab.net]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'JP'
stateOrProvinceName   :PRINTABLE:'OSAKA'
localityName          :PRINTABLE:'Minato-ku, Osaka'
organizationName      :PRINTABLE:'High Mountain'
organizationalUnitName:PRINTABLE:'WEB Development Dept.'
commonName            :PRINTABLE:'LubuntuServerClient'
name                  :PRINTABLE:'EasyRSA'
emailAddress          :IA5STRING:'master@highmountain-lab.net'
Certificate is to be certified until May 16 05:23:40 2026 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
TLS認証鍵を作成する。
$ openvpn --genkey --secret /etc/openvpn/easy-rsa/keys/tls.key
下記の4ファイルをクライアント用に使用する。
ca.crt
LubuntuServerClient.crt
LubuntuServerClient.key
ta.key


5. OpenVPNの設定・起動

OpenVPNサーバの設定をするのでサンプルのconfigファイルを/etc/openvpn配下に持って来て編集する。
$ cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
$ gunzip server.conf.gz 
server.confは下記の部分を編集する。
port 1194

proto udp

ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/LubuntuSakura.crt
key /etc/openvpn/easy-rsa/keys/LubuntuSakura.key

dh /etc/openvpn/easy-rsa/keys/dh2048.pem

server 10.8.0.0 255.255.255.0

push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"

client-to-client

tls-auth /etc/openvpn/easy-rsa/keys/tls.key 0

user nobody
group nogroup

status /var/log/openvpn-status.log
log-append  /var/log/openvpn.log
ここでOpenVPNだけstartしたら
Activation: failed for connection '有線接続 1'
とsyslogに出力され、うまく起動しなかったのでrebootしたらうまく起動された。

疲れた。iPad(iOS)から繋げるのは次回。