社内ツールアクセスのためにVPNではなくProxy Serverを構築する

どもー、 id:kazuph1986 です。

この記事はAkerun Advent Calendar 2018の3日目の記事です。

今日はサクッとEC2を利用してProxy Serverを構築した話です。

経緯

弊社では、エンジニアおよびカスタマーサポートのために社内ツールを構築・作成しており、社内外合わせた4, 5個程度を常時使いながら業務を行っています(作業内容がカニバっているものは統合のための開発も行っているので、減ったりもします)。

そしてそのすべてが社内からのIPでなければアクセスできないようになっているので、以前はどうしても社外からのアクセス必要な場合に、個人ごとにVPNの権限を渡していたのですが、そもそも社内ツールにアクセスはしたいが、社内ネットワークにつなぎたいわけではないので、権限を与えすぎという状況が生まれていました。またVPNの権限を渡せるのはある程度入社期間を経ていたり、一定以上のリテラシーがあるとCTOおよび上長から認められた人だけだったので、場合によっては特定の人に対して権限を付与することがずっとできないという状況も生まれていました。

つまりVPN(だけ)では適切な権限管理をすることができないので、融通を利かせることができる認証方式を求めていたわけでした。

解決

そこで、一定以上の強度で認証できかつ簡単な『古き良きProxy Server』を使って認証できる仕組みを構築しました。 これであれば接続毎に社内のネットワークに入る必要もありませんし、人毎に見た履歴がわかったり、見れるサイトも制限できるので、とても便利です。

またこれは今後やる予定ですが、Proxy Serverの全段にさらにAWSのCognitoなども挟むことで、さらに柔軟な権限管理も可能です。 現在はツールごとに個別にアカウント認証機能も開発していたのですが、それももしかしたら統一できるかもしれません。

これは便利。

ということで早速構築してみましょう。

1. EC2を構築する

適当なタイプのインスタンスを作ってください。

2. Squidをインストール

今回は弊社の超Web強いエンジニアのおすすめもありSquidを使ってみました。 最初「よくわからんのでnginxでよくね」って思ったのですが、毛嫌いせずに使ってみたらむしろProxyについてはSquidはすごい簡単だったので正解でした。

ちなみにここで言っているProxyはFoward Proxyです。

構築方法は以下。

sudo yum -y install squid
sudo yum -y install httpd-tools
systemctl status squid.service
sudo systemctl enable squid.service
sudo systemctl start squid.service

3. 設定

ファイルは /etc/squid/squid.conf です。

僕はこんな感じで編集しました。ホワイトリスト方式で、社内ツールだけアクセスできるようにしてます。whitelistの中身やmy_teamという単語、http_portは適当に変えてください。 http_access allow password whitelis によって、パスワード認証を通過しかつホワイトリストのURLのときだけアクセスを許可するようにしています。

+ # whitelist
+ acl whitelist dstdomain "/etc/squid/whitelist"

+ # auth
+ auth_param digest program /usr/lib64/squid/digest_file_auth /etc/squid/digest_auth
+ auth_param digest children 3
+ # auth_param digest realm Proxy Web Server
+ auth_param digest realm my_team
+ auth_param digest nonce_garbage_interval 5 minutes
+ auth_param digest nonce_max_duration 30 minutes
+ auth_param digest nonce_max_count 50
+ acl password proxy_auth REQUIRED

+ # whitelistの場合は以下
+ http_access allow password whitelis

+ http_port <適当なポート番号>
# And finally deny all other access to this proxy
http_access deny all

/etc/squid/whitelist (グーグルとAWSはあとからアセット系のロードのために追加しました)

.yourapp.com
.google.com
.amazonaws.com
.aws.amazon.com
.cloudfront.net
.amazonwebservices.com

設定後に再起動してください。

4. ユーザー登録

あとはユーザー登録します。

sudo htdigest /etc/squid/digest_auth my_team kazuph
Adding user kazuph in realm my_team
New password:
Re-type new password:

以上で完了です。

5. logを確認する

sudo tail -f /var/log/squid/access.log

6. (おまけ)ユーザーを一括で登録する

ユーザー登録時にいちいちランダムに生成したパスワードを貼っ付けるのがめんどくさかったので、以下のように自動化しました。

setup

sudo yum install expect

script

proxy_pass.sh

#!/bin/bash

digest_gen () {
    name=$1
    pass=$2
    expect -c "
        spawn sudo htdigest /etc/squid/digest_auth my_team $name
        expect \"New password:\"
        send \"$pass\n\"
        expect \"Re-type new password:\"
        send \"$pass\n\"
        expect \"$\"
    "
}

for name in $(cat list); do
    echo --START--
    echo USERNAME $name
    pass=$(mkpasswd -l 20 -s 0)
    echo PASSWORD $pass
    digest_gen $name $pass
    echo $name $pass >> pwlist
    echo --DONE--
done

listは以下のような想定

taro.yamada
jiro.sato
santaro.suzuki

以上で構築完了です。

まとめ

やってみたら案外簡単だったので、むしろVPNを構築を考えているのであれば一考の価値ありです。 最初検索したらパスワードは平文でしか保存できないと出てきたのですが、んなわけあるかーい!って思ったらちゃんとハッシュ化されたパスワードで保存できました。 自分で一次情報を調べるって大事ですね。

途中で書いたように、今後はCognitoと連携するとめっちゃいい感じに権限管理ができると思うので、それについてもチャレンジしてみます(Elasticsearch構築のときに本当は試したんですけどね)。

ということで、今回はProxy Server構築をする話でした。

ではでは。


Photosynthでは一緒にはたらく仲間を募集しております!

採用情報 | 株式会社フォトシンス Photosynth Inc.