sshuttleで簡易VPN的環境の構築

 昨今のテレワークブームはいかがお過ごしでしょうか?突然の世の中の働き方の転換を迎え、特に社内システム担当の方は非常に大変な状況に見舞われているのではないかと思います。
 ゼロトラストやBeyondCorpなど最先端の企業ではもはやVPNは使わないといったことが取りざたされていますが、実際のところ一足飛びにそういった環境が用意できる訳でもなく、普段からそういったセキュリティポリシーをしっかりと考え仕組みを構築している企業だからこそ可能な取り組みかと思います。
 そういう意味では、やはり昔ながらのVPNというのが簡単かつセキュアにリモートネットワークにアクセスする仕組みになるかと思いますが、そうした環境の構築も少なからず時間がかかるものになります。今回はそうした方々が簡単に導入可能なsshuttleという簡易なVPN環境が構築できるツールを紹介したいと思います。タイトルには簡易VPNと書きましたが、正確にはVPNではありませんのでご注意ください。
 これはSSHができる踏み台サーバーさえあれば、クライアント側でsshuttleをインストールするだけで利用可能になるため導入が非常に簡単なツールになります。

できること

  • ssh経由でリモートのネットワークにアクセスができる
  • リモートネットワークのWebサーバやファイルサーバにポートフォワードを設定しなくてもアクセスが可能

イメージ図

f:id:cloudfish:20200306171654p:plain

前提条件

SSH接続可能なサーバーが構築されていること

インストール方法

sshuttleはクライアント側にインストールするだけになります。
Macの場合のインストール方法は以下になります。

brew install sshuttle

Mac以外は以下を参照してください。残念ながらWindowsは対象外です。未検証ですがWSLから利用できるかもしれません。
github.com

接続方法

上記イメージ図の構成の場合、ターミナルから以下のようなコマンドを実行します
ssh configに以下を設定

Host bastion
  HostName xxx.xxx.xxx.xxx
  User ec2-user
  IdentityFile ~/.ssh/bastion.pem

以下の接続コマンドを実行する

sshuttle --dns -r bastion 10.10.0.0/16

「--dns」オプションを付与しておくと、接続中はリモートネットワークのDNSが参照可能になります。これは結構良いオプションだと思います。例えば、AWSの場合だとRoute53でプライベートゾーンが作成できますが、接続中はローカル端末からもそのゾーンの名前解決が可能になります。
最後のCIDRの「10.10.0.0/16」は、リモートネットワークのCIDRを指定します。複数ある場合はスペース区切りで設定してください。

上記で接続中にしたままにすることで、後はSSHなりDB接続なりファイルサーバへの接続が可能になります。

よりセキュアに接続するには?

sshで公開鍵認証とはいえ、SSHをフル解放するのはあまり精神的によくありませんよね。そこでよりセキュアにする方法としては以下の方法が考えられます。

  • MFAによる多要素認証を行う
  • Session Managerを利用してSSH接続を行う

MFAによる多要素認証

利用者が在宅で作業する場合にはIP制限が難しいと思いますので、鍵認証に加えてMFAによる認証を行うことで、よりセキュアな構成が可能になります。設定方法については以下を参照してください。
また、この方法であればリモートネットワークがAWS以外の場合でも対応が可能です。
dev.classmethod.jp

セッションマネージャを利用してSSH接続を行う

こちらはリモートネットワークがAWS環境前提の話となりますが、踏み台となるサーバをパブリックサブネットではなく、プライベートサブネットに配置してセッションマネージャを使ってアクセスすることできるのでよりセキュアにできます。セッションマネージャについてはSSHが利用できるようになりましたので、これを通じてsshuttleの利用も可能となります。

** 設定方法
SSMエージェントやSession Managerプラグインのアップデートが必要となりますので、以下のブログを参照してアップデートしてください。
dev.classmethod.jp

接続方法

ssh config

ssh configに以下の設定を行います。INSTANCE_IDとAWS_PROFILEについては接続先のEC2のインスタンスIDとAWSアカウントのプロファイルを指定してください。

Host bastion
  User ec2-user
  IdentityFile ~/.ssh/bastion.pem
  ProxyCommand sh -c "aws ssm start-session --target $INSTANCE_ID --document-name AWS-StartSSHSession --parameters 'portNumber=%p' --region=ap-northeast-1 --profile $AWS_PROFILE"
接続

以下のコマンドで接続が可能です。

sshuttle --dns -r bastion 10.10.0.0/16

まとめ

いかがでしょうか?検証してみた印象としては結構簡単に使えるのではないかと思いました。ただし、SSH接続が必要になりますのでエンジニア以外が利用するには少しハードルが高いかもしれませんが、利用してみる価値はあるのではないでしょうか。