まだプログラマーですが何か?

プログラマーネタ中心。たまに作成したウェブサービス関連の話も https://twitter.com/dotnsf

タグ:openvpn

このブログは IBM Cloud アドベントカレンダー 2020 13日目にエントリーしています。


IBM Cloud が提供している多要素認証サービスである IBM Security Verify for Workforce IAM を使う機会がありました。簡単に各種多要素認証を実装できるサービスだったので、備忘録の意味でもまとめてみました。

【IBM Security Verify for Workforce IAM で実現できる多要素認証の種類】
まず、このサービスを有効にすることで利用できる多要素認証の要素は以下の4種類あります:
(1) ワンタイムパスワード
(2) 確認タップ
(3) SMS
(4) メール


(1) と (2) はスマホに専用アプリ(IBM Security Verify)をインストールすることで利用可能になります。(1) は同アプリ内に表示されているワンタイムパスワードを制限時間内に入力することで確認するもの、(2) は同アプリ内に通知される確認メッセージに対して「承認」のタップを行うことで確認されます。「入力の手間がない」という点ではこの (2) が最も楽な要素といえると感じています。 また (3) はスマホへの SMS に送信されたワンタイムパスワードを入力するもの、(4) は指定したメールアドレスへ送信されたワンタイムパスワードを入力するものです。(3) と (4) は専用アプリを必要としないため、古いスマホやスマホ以外の電話機でも利用可能です(メールに関しては電話機である必要もありません)。



【IBM Security Verify for Workforce IAM を使った多要素認証】
実際に多要素認証を実現するまでの大きな流れとしては、以下の2段階となります:
1. 多要素認証サービスに登録する
2. 各種ログイン時に 1. のサービスが有効になるよう設定する



少し細かく紹介すると、1. はサービスへサインインすることに加えて、多要素認証で利用する手法を登録します。具体的にはメール、電話、SMSそしてスマホ向けの専用アプリです。一般的に多要素認証で使われるのはメール、電話、SMS でコードを知らせて入力させる、という方法ですが、最後の専用アプリを使うとプッシュで知らされる通知に「承認」タップをするだけで認証が完了します。2段階目の手続きが一番楽になる方法でもあります。

2. は 1. で登録した多要素認証サービスを「どの」認証の際に使うか、という設定です。今回のブログでは
 (1) Windows へのログイン時
 (2) Linux 等への SSH ログイン時

の2種類それぞれで使う場合の設定手順を紹介します。


【IBM Security Verify for Workforce IAM の無料評価版に登録】
まずは上記 1. のサービス登録部分を行います。

IBM Security Verify for Workforce IAM のページへ行き、「無料評価版を試す」というボタンをクリックします:
https://www.ibm.com/jp-ja/products/verify-for-workforce-iam

2020103001



IBM ID でのログインが求められるのでログインします。その後、テナントサーバーのホスト名の入力が促されるので、ユニークな(他の人が使ってなさそうな)文字列を入力して "Create tenant" ボタンをクリックします。基本的に作業はこれだけです:
2020103002


試用アカウントの作成等、色々準備が進んでいくので少し待ちます:
2020103003


1~2分程度で「ようこそ」画面が表示されます。使用条件同意にチェックを入れて「続行」:
2020103004


すると IBM Security Verify のダッシュボード画面が表示されます。これで IBM Security Verify のアカウントが作成できました:
2020103005



【IBM Security Verify for Workforce IAM に API client を登録】
サービスへのサインアップはこれだけで完了です。次に各種クライアントからこのサービスを利用できるよう、IBM Security Verify for Workforce IAM に API client を登録します。左上のハンバーガーメニューから "Configuration" を選択します:
2020112601



Configuration の "API access" タブを選択し、"Add API client" ボタンをクリックします:
2020112602


API Client を追加するダイアログが表示されます。まず適当な名前(例 MFA-Client)を入力して、Enabled がチェックされていることを確認します(まだ Save を押さずに下にスクロールします):
2020112603


そのまま下にスクロールして、Access 欄で以下の4つにチェックを入れ、最後に Save をクリックします:
- Authenticate any user
- Read authenticator registrations for all users
- Read second-factor authentication enrollment for all users
- Read users and groups

2020112604


1つ前の画面に戻り、作成した API client が一覧に表示されていることを確認します。この一覧の右側に EDIT ボタンがあるのでここをクリックします:
2020112605


クリックすると、この API client の Client ID と Client secret を確認することができます。後ほど使うのでメモしておきます:
2020112606


【IBM Security Verify for Workforce IAM にユーザーを登録】
次に IBM Security Verify for Workforce IAM に2要素認証を行うユーザーを登録します。左上のハンバーガーメニューから "Users & groups" を選択します:
2020112607


まだユーザーが登録されていない初回は最初にユーザー登録ダイアログが表示されます。以下を指定して(他は適当に指定して)Save をクリックします:
- Identity source : Cloud Directory
- user name : (これから作成するユーザーのログイン時のユーザー名)
- Work e-mail : (これから作成するユーザーのメールアドレス、この後ここにメールが送信される)
- Mobile number: (これから作成するユーザーの携帯電話番号、日本の携帯電話であれば +81 を付け、更に最初の 0 を消して登録する。このあと SMS 認証で利用する)

2020112608


ここまで完了したら(次に新規ユーザーでサインインできるよう)このアカウントではいったんサインアウトします。画面右上のアイコンから "Sign out" を選択します:
2020112609


サインアウトできました:
2020112610



【IBM Security Verify for Workforce IAM にユーザーのデバイス(スマホ)を登録】
ここからは登録されたユーザーによる作業となります。

先ほどユーザー作成時に指定したメールアドレスの受信ボックスを確認してください。IBM Security から Account created というサブジェクトのメールが送信されているはずです。その中に user name で指定したログイン名と初期パスワードが表示されています。下の URL をクリックしてログインします:
2020112611


ログイン画面が表示されたら、メールに記載されていた user name と password を指定してログインします:
2020112612


最初の1回目は初期パスワードから別のパスワードへ変更する必要があるので、自分で管理できるパスワードに変更してください:
2020112613


全て完了すると登録したユーザーで IBM Security Verify にログインします:
2020112614


次のこのユーザーのスマートフォンと、認証デバイスを登録します。画面右上のアイコンをクリックして、"Profile & settings" を選択します:
2020112615


まず登録したユーザー情報のメールアドレスや電話番号が正しいものかどうかをを確認するための画面が表示されます。確認方法は選択できますが、今回は SMS(Text message) を使って確認することにします。"Text message" の横にある "Send code" をクリックします:
2020112616


すると登録時に指定した電話番号に SMS でコードが届きます。そのコードを認証画面内に登録して Submit します:
2020112617


正しいコードを入力することができると携帯電話の登録が完了します。一応これだけでも利用できるのですが、専用アプリを登録しておくと2段階認証時の手続きが簡単になるので、続けて専用アプリを登録しておきます。"Add new method" と書かれた箇所をクリックします:
2020112618


登録するデバイスを選択する画面になります。ここでは IBM Verify app 横の "Add device" をクリックします:
2020112619


スマートフォンに "IBM Verify" アプリケーションをインストールするよう求められます。App Store や Google Play から "IBM Verify" を検索してアプリをインストールしてください。インストールできたら "Connect your account" を選択します:
2020110404


画面に QR コードが表示されます。この QR コードをスマホにインストールした IBM Verify を開いて Q読み取ります:
2020110405


デバイスが登録されますが、まだ "Unauthorized" という扱いになっています。アプリケーションの認証コードを入力してこのアプリケーションとデバイスを認証します:
2020110406


成功するとこのような画面になります:
2020110407


"Authentication app" として表示されていれば成功です:
2020110408



ここまでの作業で上記 1. の多要素認証サービスへの登録作業が完了しました。

ここから下は 2. の作業になります。実際に多要素認証を利用する認証方法ごとに行います。



【Windows へのログイン時に多要素認証を行う場合】
Windows へのログイン時に多要素認証を行う場合の作業手順を説明します。
そのための作業として、対象の Windows PC に IBM Security Verify for Windows Login という Windows アプリケーションを導入します。

まず IBM Security Verify for Windows Login の動作に必要な VSVC++ ランタイムをダウンロードしてインストールします:
https://support.microsoft.com/ja-jp/help/2977003/the-latest-supported-visual-c-downloads

2020113002



続いて以下から IBM Security Verify Gateway for Windows Login をダウンロードします:
https://exchange.xforce.ibmcloud.com/hub/IdentityandAccess

2020113001


ダウンロードしたファイルを展開し、setup.exe を実行してインストールします:
2020113003


インストール後、C:\Program Files\IBM\WindowsLogin\ フォルダ以下にある config.json.sample ファイルをテキストエディタで開きます:
2020113004


以下の内容で書き換え、config.json という名前で保存します:
{
    "ibm-auth-api":{
        "client-id":"********",
        "obf-client-secret":"XXXXXXXXXXXX", /* See obfuscate.exe tool. */
        "protocol":"https",
        "host":"xxxxxxx.verify.ibm.com",
        "port":443,
        "max-handles":16
    },
    "credential-provider":{
        "username-format":"%U",
        /*"trace-file":"c:/tmp/credprov.log", */
        "disable-builtin-password-logon": false,
        "no-mfa-account": "XXXXXXXX\\Administrator",
        "auth-method":"winpwd-then-choice-then-otp"
    }
}

上記を編集する際の注意点があります。

まず client-id には上述の作業で API client を登録した際に取得した Client ID の値をそのまま入力します。

obf-client-secret の値は少し手順が必要です。config.json.sample と同じフォルダに obfuscate.exe というコマンドラインツールがあります。コマンドプロンプトを開いて、以下のコマンドを実行します:
> obfuscate (API client を登録した際に取得した Client Secret の値)

この実行結果として表示される内容を上記 obf-client-secret の値として入力してください(Client Secret の値をそのまま入力するわけではない点に注意してください)。

そして host は IBM Security Verify for Workforce IAM サインアップ時に指定した tenantId を使った "{tenantId}.verify.ibm.com" という値を指定します。

更に username-format の値には "%U" を、no-mfa-account の値にはこの Windows PC の名前(XXXXXXX)を使って "XXXXXXX\\Administrator" と指定してください(最後の設定により Administrator アカウントのみ多段階認証が無効になります)。


最後にこのファイルを同じフォルダ内に config.json という名前で保存すれば準備完了です。

では実際に Windows で多要素認証が有効になっているかどうかを確認します。Windows のログイン画面で Administrator アカウント以外のユーザーを指定します。するとパスワード入力画面に "Sign-in options" というメニューが現れます:
2020120601


同部分をタップして開き、盾のようなアイコンを選択します(選択されていることを確認します):
2020120602


この状態でまずは普通にログインパスワードを入力します:
2020120603


すると2要素目の認証方法を聞かれます。どれを選択してもいいのですが、ここではメールアドレスを選択してみます:
2020120604


すると登録したメールアドレスに IBM Security からメールが届きます。その中にワンタイムパスワードが含まれています:
2020120605


メール内のパスワードをログイン画面に入力して再度 submit します:
2020120606


2要素認証を経て Windows にログインできました:
2020120607



【Linux への SSH ログイン時に多要素認証を行う場合】
Linux へ SSH でログインして作業する機会は珍しくないと思いますが、そのログインを2要素認証にすることも可能です。その手順を紹介します。なおここでは Linux 向け手順を紹介しますが、同様にして AIX 版を利用することで AIX へ適用することも可能です。

前提として、上述の 1. の手続き(IBM Security Verify for Workforce IAM へのサインアップとユーザー&デバイスの登録)まで済ませておきます。また今回の作業を行う対象となる Linux サーバーを用意します(SSH 可能な状態でセットアップします)。

続いて以下から IBM Security Verify Gateway for Linux PAM をダウンロードします:
https://exchange.xforce.ibmcloud.com/hub/IdentityandAccess

2020120608


対象の Linux に root でログインし、以下の手順でパッケージを展開し、インストールします:
# unzip IBMSecurityVerifyGatewayForLinuxPAM_v1.0.3.zip

# cd IBMSecurityVerifyGatewayForLinuxPAM_v1.0.3

# unzip centos7.zip (CentOS 7 or 8 の場合)

# rpm -ivh *.rpm

同パッケージが正しく動作するようデーモンを設定します。vi などのテキストエディタで /etc/pam_ibm_auth.json を編集します:
{
  "ibm-auth-api": {
    "client-id": "********",
    "obf-client-secret": "XXXXXXXXXXXX",
    "protocol": "https",
    "host": "xxxxxxx.verify.ibm.com",
    "port": 443,
    "authd-port": 12,
    "max-handles": "16"
  },
    :
}

↑具体的には上述の IBM Security Verify for Windows Login で指定したものと同様の設定を指定して保存します。

設定ファイルを編集したらデーモンを有効にします:
# systemctl enable ibm_authd_64.service --now

この後で ssh による多段階認証を有効にしますが、「設定が間違っていて、修正したいけど誰もログインできなくなった」という状態を避けるために多段階認証を適用しないユーザーも必要です。今回は root ユーザーは多段階認証なしにログインできるよう設定しておく例を紹介します:
# groupadd -r nomfa

# usermod -aG nomfa root

では sshd の設定も変更して、SSH 時の2段階認証を有効にします。まず /etc/pam.d/password-auth ファイルを /etc/pam.d/civ-auth-choice というファイルにコピーし、その上で /etc/pam.d/civ-auth-choice ファイルを編集します:
  :
  :
auth    requisite    pam_unix.so nullok try_first_pass
auth    sufficient   pam_ibm_auth.so auth_method=choice-then-otp exempt_group=nomfa
add_devices_to_choice transients_in_choice failmode_insecure accept_on_missing_auth_method
  :
  :

まず pam_unix.so を参照している auth から始まる行を探します。そして2列目の sufficient を requisite に変更します。そしてその直下に1行追加し、"auth    sufficient   pam_ibm_auth.so auth_method=choice-then-otp exempt_group=nomfa add_devices_to_choice transients_in_choice failmode_insecure accept_on_missing_auth_method " という行を追加して保存します。

続いて /etc/ssh/sshd_config ファイルを編集し、ChallengeResponseAuthentication で始まる行を探して、その値を yes に変更します(コメントされていたらコメントアウトします):
  :
  :
#ChallengeResponseAuthentication yes
ChallengeResponseAuthentication yes
  :
  :

この後で sshd を再起動します:
# systemctl restart sshd

sshd のプロセスは SELinux で守られていて、特定のポートを通じてのみアクセスできます。この部分も変更する必要があります:
# semanage port -a -t kerberos_port_t -p tcp 12

最後に PAM の設定をこれまでの作業内容を参照するよう変更します。/etc/pam.d/sshd を以下のように変更します:
#%PAM-1.0
auth  required  pam_sepermit.so
auth  substack  civ-auth-choice
auth  include   postlogin
  :
  :

↑"auth substack" で始まる行を探して、3列目の値を "password-auth" から "civ-auth-choice" に変更して保存します。

これで SSH の2段階認証が有効になっているはずです。動作確認のため以下のコマンドで(localhost で)SSH ログインしてみます(username 部分には存在するユーザーの名前を指定してください):
# ssh username@localhost

上述の Windows の時と同様に、パスワードを聞かれた後に2段階目の認証方法を聞かれます:
2020120601


今回は1番を選択した例を紹介します。上述の IBM Verify アプリをスマホに導入している場合に使うことができる選択肢です。1を入力すると OTP(ワンタイムパスワード)を聞かれます:
2020120602


この時点で登録したデバイスの IBM Verify アプリを起動し、このタイミングでのアクセスコード(ワンタイムパスワード)を確認します:
2020120605


表示されている有効期限内に入力できるようなタイミングを図りつつ、ワンタイムパスワードを入力します:
2020120603


正しく入力できると ssh が成功し、リモートログインが完了します(下図ではプロンプトが # から $ に変わっています):
2020120604


Linux の SSH でも2要素認証が実現できました。


【まとめ】
以上、手順含めての紹介だったこともあり、かなり長い説明になってしまいましたが、これだけの手続きで各種ログインの多要素認証が実現できることがわかりました。しかも90日間の体験版として無料提供されている機能を使って実現できたので、実際に本格導入する前の動作確認まで出来て、かなりお得なサービスであるように感じます。

今回紹介した多要素認証は Windows ログインと Linux (SSH) ログインでした。用語などで慣れないと戸惑う部分があるかもしれませんが、自分が躓いた所を中心に日本語解説資料を作るつもりで紹介しました。ぜひ皆さんにも試していただければと思っています。

CentOS に OpenVPN のコマンドラインクライアントを導入する手順を紹介します。


OpenVPN そのものは yum で導入可能ですが、前提として EPEL のリポジトリが必要です。未登録の場合はこのコマンドで EPEL リポジトリを作成しておきます:
# rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

そして EPEL リポジトリから OpenVPN を導入します:
# yum install --enablerepo=epel openvpn

これで導入は完了です。/usr/sbin/openvpn コマンドが導入されたはずです:
# which openvpn
/usr/sbin/openvpn

次に接続の設定を行います。.crt ファイルや .ovpn ファイルが存在する場合はそのまま使います。設定ファイルは /etc/openvpn/ フォルダ以下にまとめてコピーしておきます。ない場合は以下のような内容の接続設定ファイルを作成します(以下は一例です。XX.XX.XX.XX 部分に VPN サーバーのアドレスを指定しています。/etc/openvpn/wasaas-uss.ovpn というファイル名で作成しているものとします):
client
dev tun
proto tcp
remote XX.XX.XX.XX 1194
remote-random
resolv-retry infinite
nobind
persist-key
persist-tun
ca wasaas-uss-ca.crt
cert wasaas-uss-client.crt
key wasaas-uss-client.key
ns-cert-type server
verb 3

接続設定ファイルができたら、そのファイルを指定して OpenVPN クライアントを起動します。なお、このコマンドは VPN 接続中はプロンプトが戻ってこないので、メインで利用するのは別のターミナルを開いて行ってください:
# cd /etc/openvpn
# openvpn /etc/openvpn/wasaas-uss.ovpn

しばらく待つと、以下の様なメッセージが表示されて、VPN 接続が完了したことがわかります(プロンプトは戻ってきません):
  :
  :
Wed Jan 20 17:11:30 2016 /sbin/ip route add 169.55.255.64/27 via 10.255.255.1
Wed Jan 20 17:11:30 2016 /sbin/ip route add 169.55.255.160/27 via 10.255.255.1
Wed Jan 20 17:11:30 2016 /sbin/ip route add 169.45.151.32/27 via 10.255.255.1
Wed Jan 20 17:11:30 2016 /sbin/ip route add 169.54.255.192/27 via 10.255.255.1
Wed Jan 20 17:11:30 2016 /sbin/ip route add 169.55.4.160/27 via 10.255.255.1
Wed Jan 20 17:11:30 2016 /sbin/ip route add 169.55.235.0/27 via 10.255.255.1
Wed Jan 20 17:11:30 2016 /sbin/ip route add 169.45.191.0/25 via 10.255.255.1
Wed Jan 20 17:11:30 2016 Initialization Sequence Completed


この状態で ifconfig コマンドを実行すると、VPN 接続で追加された tun0 デバイスが確認できて、IP アドレスも正しく設定されていることが確認できるはずです:
# ifconfig
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:356 errors:0 dropped:0 overruns:0 frame:0
          TX packets:356 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:228991 (223.6 KiB)  TX bytes:228991 (223.6 KiB)

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:10.XX.XX.XX  P-t-P:10.255.255.9  Mask:255.255.255.0
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

wlan0     Link encap:Ethernet  HWaddr CC:E1:D5:3E:37:A2  
          inet addr:192.168.0.114  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:627126 errors:0 dropped:0 overruns:0 frame:0
          TX packets:253371 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:272600426 (259.9 MiB)  TX bytes:157587766 (150.2 MiB)

これで VPN 接続ができました。VPN 接続を終了する場合は openvpn コマンドを実行したターミナルで Ctrl+C を実行して、コマンドを終了してください。


自分は自宅に CentOS を中心に構築した簡易ローカルネットワークがあります。自宅には固定の光回線もあるので、ブロードバンドルーターのポートフォワーディング機能を使って自宅内の HTTP サーバーを公開したり、SSH サーバーや DB サーバーににインターネットからログインできるようにしていました。
2015022401



もちろんこれはこれで便利ではあったのですが、自宅内に KVM の仮想サーバーを構築したあたりから少しずつ限界を感じることがでてきました。仮想サーバーができたことで簡単&気楽にマシンを増やして使うことができるようになるのはいいのですが、動的に増やしたマシンに接続するための設定として、2つ以上の異なる HTTP サーバーに 80 番ポートで接続したい、とか、ポートフォワーディングだけでは限界を感じることが多くなってきたのでした。まあ自宅ネットワーク環境もこんな悩みを抱えるレベルになれば立派かな、という感じ:
2015022402




この状況を打破するべく、 自宅ネットワークに VPN(Virtual Private Network) 環境を構築することにしました。結果的にですが、PC と自宅ネットワークとの間の通信をすべて暗号化することにもなるので、セキュリティ的にも向上することになります。この環境をオープンソースの OpenVPN を使ってすべて無料で構築したのですが、その手順をまとめました。


まず目標として、最終的には以下の様なネットワーク構成を作ることにしました:
・自宅ネットワークは 192.168.0.0/24 で、ルータ/DHCP/DNS 含めて今まで使ってきた自宅ネットワーク環境を変えずにそのまま使う。 
・自宅ネットワークのブロードバンドルータは 192.168.0.1、このブロードバンドルータの公開サーバー名は www.myserver.com とする。
・OpenVPN を導入する VPN サーバーは 192.168.0.4(CentOS)
・VPN で接続するクライアントは Windows7 を想定
・VPN で接続するクライアントのネットワークは 10.8.0.0/24(OpenVPN のデフォルト)
・VPN で接続したクライアントから自宅ネットワークへ、自宅ネットワーク内のマシンから VPN で接続したクライアントへの双方向の通信を可能にする
2015022403


上記の最後の文を補足します。この環境ができて VPN 接続ができた後に、VPN のクライアント機(Windows7)からは 192.168.0.XX というそのままのアドレスで自宅ネットワークの各サーバーに接続ができるようになります。加えて自宅ネットワーク内の各サーバー機からも 10.8.0.X というアドレスを指定することで Windows7 機にアクセスできるようになる、この双方向でのアクセスが可能になるような環境とする、ということを目標にします。


では以下にその構築手順を記載します。まず自宅ネットワーク内の1台のマシンに OpenVPN サーバーをインストールします。今回はこのマシンの IP アドレスが 192.168.0.4 で、CentOS が導入されているものと仮定します。また 2015/02/24 時点では OpenVPN の最新バージョンが 2.3.6 だったので、このバージョンをインストールしています。実際にはこちらを参照して、最新バージョンを確認し、最新バージョンのモジュールをダウンロードするようにしてください。

このマシンにログインして root 権限でシェルを開き、以下のコマンドを順次実行します:
# cd /usr/local/src
# yum -y install openssl-devel lzo-devel pam-devel

(最新の OpenVPN をダウンロードしてビルド)
# wget http://swupdate.openvpn.org/community/releases/openvpn-2.3.6.tar.gz # rpmbuild -tb --clean openvpn-2.3.6.tar.gz # yum -y localinstall ~/rpmbuild/RPMS/x86_64/openvpn-2.3.6-1.x86_64.rpm # rm -f ~/rpmbuild/RPMS/x86_64/openvpn-* # rm -f openvpn-2.3.6.tar.gz
(easyrsa をダウンロードしてビルド) # wget https://github.com/OpenVPN/easy-rsa/archive/master.zip # unzip master.zip # cp -r easy-rsa-master/easyrsa3/ /etc/openvpn/ # rm -rf easy-rsa-master/ # rm -f master.zip

これで OpenVPN の導入はできました。次にこの導入モジュールを使って各種鍵・証明書ファイルを作ります:
(初期化)
# cd /etc/openvpn/easyrsa3/
# ./easyrsa init-pki

(CA証明書と秘密鍵作成)
# ./easyrsa build-ca
 (パスフレーズの入力を促されるので2度同じ内容を入力)
 (Common Name(サイト名)を聞かれたらサーバー名(www.myserver.com)を入力)
# cp pki/ca.crt /etc/openvpn/

(サーバー証明書と秘密鍵作成)
# ./easyrsa build-server-full server nopass
 (パスフレーズを聞かれるので、先ほど入力したパスフレーズを入力)
# cp pki/issued/server.crt /etc/openvpn/
# cp pki/private/server.key /etc/openvpn/

(DHパラメータ作成)
# ./easyrsa gen-dh
# cp pki/dh.pem /etc/openvpn/

(ダミーのクライアント証明書作成)
# ./easyrsa build-client-full dmy nopass
 (パスフレーズを聞かれるので、先ほど入力したパスフレーズを入力)

(ダミーのクライアント証明書廃止)
# ./easyrsa revoke dmy
 ("Continue with revocation" と表示されたら yes と入力)
 (パスフレーズを聞かれるので、先ほど入力したパスフレーズを入力)

(証明書廃止リスト作成)
# ./easyrsa gen-crl
 (パスフレーズを聞かれるので、先ほど入力したパスフレーズを入力)
# cp pki/crl.pem /etc/openvpn/
# chmod o+r /etc/openvpn/crl.pem

(TLS認証鍵作成)
# openvpn --genkey --secret /etc/openvpn/ta.key
# cp /usr/share/doc/openvpn-2.3.6/sample/sample-config-files/server.conf /etc/openvpn/

上記で最後にコピーした OpenVPN の設定ファイルを編集します:
# vi /etc/openvpn/server.conf
    :
  (変更が必要な該当箇所のみ記述、ここにある内容以外はそのままで)
    :
dev tun

dh dh.pem

server 10.8.0.0 255.255.255.0

;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"
push "route 192.168.0.0 255.255.255.0"

tls-auth ta.key 0 # This file is secret

user nobody
group nobody

log-append  /var/log/openvpn.log

# 以下の2行を最終行に追加
management localhost 7505
crl-verify crl.pem

更に easyrsa3 ディレクトリでクライアント証明書および秘密鍵ファイルを生成しておきます。なお、以下の例では client1 という名前のクライアント証明書・秘密鍵ファイルを生成していますが、このクライアント名は一意である必要があります。複数クライアント向けに複数の証明書や秘密鍵ファイルを生成する場合は、既に作成したクライアント名と重ならないように注意してください:
# cd /etc/openvpn/easyrsa3
# ./easyrsa build-client-full client1
 (クライアント用パスフレーズの入力を促されるので2度同じ内容を入力)
 (サーバー用パスフレーズを聞かれるので、作成時に入力したパスフレーズを入力)

起動スクリプトとシャットダウンスクリプトを新規に作成します:
# vi /etc/openvpn/openvpn-startup
#!/bin/bash

/etc/openvpn/openvpn-shutdown
iptables -I OUTPUT -o tun+ -j ACCEPT
iptables -I FORWARD -o tun+ -j ACCEPT

iptables -I INPUT -i tun+ -j ACCEPT

iptables -I FORWARD -i tun+ -d 192.168.1.0/24 -j ACCEPT


# chmod +x /etc/openvpn/openvpn-startup
# vi /etc/openvpn/openvpn-shutdown
#!/bin/bash

delete() {
  rule_number=`iptables -L $target --line-numbers -n -v|grep tun.|awk '{print $1}'|sort -r`
  for num in $rule_number
  do
    iptables -D $target $num
  done
}

target='INPUT'
delete

target='FORWARD'
delete

target='OUTPUT'
delete

# chmod +x /etc/openvpn/openvpn-shutdown

ログローテーションの設定ファイルを新規に作成します:
# vi /etc/logrotate.d/openvpn
/var/log/openvpn.log {
  missingok
  notifempty
  sharedscripts
  postrotate
    systemctl restart openvpn 2>&1 > /dev/null || true
  endscript
}

ここまでの準備ができていれば OpenVPN サーバーを起動し、自動起動設定も行います:
# vi /etc/init.d/openvpn

 (この行のコメントを外す)
  echo 1 > /proc/sys/net/ipv4/ip_forward


# /etc/init.d/openvpn start
# chkconfig openvpn on

次にルータ(この例では 192.168.0.1)上で UDP/1194 へのアクセスを VPN サーバー(この例では 192.168.0.4)にフォワーディングするよう、ポートフォワード(と必要であればファイアウォール)の設定を行います。この具体的な手順はお使いのルータごとに異なるため、ルータの説明書などを参照しておこなってください:
2015022404


更にルータ上のルーティングを変更し、このネットワーク内での 10.8.0.0/24 宛のデータは VPN サーバー(この例では 192.168.0.4)をゲートウェイとするようにルーティングエントリを追加します。これで VPN ネットワークに接続したマシンへネットワーク側から接続することもできるようになります。この具体的な手順もお使いのルータごとに異なるため、ルータの説明書などを参照しておこなってください:
2015022405


これで OpenVPN サーバーおよびルータ型の設定が完了しました。 続けて VPN クライアント(PC側)の設定を行います。

この VPN ネットワークに接続したい PC で OpenVPN のダウンロードページを開き、環境にあった Installer をダウンロード・ダブルクリックして導入します:
2015022406


導入先フォルダの中にクライアント設定ファイルのサンプル(C:\Program Files\OpenVPN\sample-config\client.ovpn)があるので、このファイルを C:\Program Files\OpenVPN\config\client.ovpn としてコピーし、以下の内容に書き換えます(変更箇所のみ記載しています):
remote www.myserver.com 1194 # VPN サーバー名

ca ca.crt # CA証明書のファイル名
cert client1.crt # クライアント証明書のファイル名
key client1.key # クライアント秘密鍵のファイル名

tls-auth ta.key 1 # 行頭にコメントが付いているので外して TLS 認証を有効化

VPN クライアントから VPN サーバーのマシンに SFTP などで接続し、CA 証明書(/etc/openvpn/ca.crt)/クライアント証明書(/etc/openvpn/easyrsa3/pki/issued/client1.crt)/クライアント秘密鍵(/etc/openvpn/easyrsa3/pki/private/client1.key)/TLS認証鍵(/etc/openvpn/ta.key)の各ファイルを転送し、すべて C:\Program Files\OpenVPN\config フォルダ内に保存します。


最後に、この VPN クライアントは Windows7 上では管理者権限で実行する必要があるため、その設定を行います。

スタート → すべてのプログラム → OpenVPN → OpenVPN GUI を右クリックし、「プロパティ」を選択します:
2015022407


"OpenVPN GUI のプロパティ" ダイアログが表示されたら「互換性」タブを選び、「管理者としてこのプログラムを実行する」にチェックを入れます。最後に OK をクリックしてダイアログを閉じます:
2015022408



これで準備はすべて整いました。最後に実際に VPN 接続して動作確認してみます。

VPN クライアントを導入した PC が自宅以外のインターネットに接続している状態で、先ほどの手順で OpenVPN GUI を選択して起動します:


OpenVPN クライアントがタスクバーに格納された状態で起動します。この時点では接続できていないので灰色で表示されているはずです。このアイコンを右クリック → 接続を選択します。
2015022409


OpenVPN のコンソールが表示され、パスワードを聞かれます。ここではクライアントの証明書を作成する時に指定したパスフレーズを入力して OK ボタンをクリックします:
2015022410


正しく接続できるとアイコンが緑色になります。同時に新たに割り当てられた IP アドレス(この例では 10.8.0.6)が吹き出し表示されます:
2015022411


この状態で自宅ネットワーク内のサーバーの IP アドレス(192.168.0.XX)を指定すれば接続できるはずです:
2015022412

逆に自宅ネットワーク内のサーバーから割り当てられた IP アドレスに対しても接続できているはずです:
2015022413


繋がりました! これで外から自宅ネットワークに対してセキュアに、しかもポートフォワードの制約を受けずにアクセスできるようになりました。

VPN 接続を切断するにはタスクバーのアイコンを右クリック→切断 を選択します:
2015022414



今回紹介した方法は Windows クライアントを前提としていましたが、証明書や秘密鍵の作り方を少し変えると iPhone などでも利用できるようになります。 詳しくは以下の参考ページを参照ください:


(参考)
http://centossrv.com/openvpn.shtml


 

このページのトップヘ