Upgrade to Pro — share decks privately, control downloads, hide ads and more …

WireGuardとOpenID Connectの連携をGoで実装してみた

Kurochan
August 19, 2021

WireGuardとOpenID Connectの連携をGoで実装してみた

社内勉強会で発表した資料です
https://github.com/kurochan/oidc-wireguard-vpn/

Kurochan

August 19, 2021
Tweet

More Decks by Kurochan

Other Decks in Technology

Transcript

  1. WireGuardとOpenID Connectの連携を
    Goで実装してみた
    株式会社サイバーエージェント AI事業本部
    黒崎 優太 (@kuro_m )

    View full-size slide

  2. 黒崎 優太
    • 株式会社サイバーエージェント
    AI事業本部 アプリ運⽤センター
    • ⼩売業界 x DXの事業をやっています
    • バックエンドエンジニア
    直近はAWSとかGCPとかセキュリティまわりの
    仕事をしていました
    @kuro_m @kurochan #times_kurochan

    View full-size slide

  3. VPNを作ってみました

    View full-size slide

  4. VPNサーバが欲しくなった経緯
    • AI事業本部内のDX本部に異動しました
    • 詳しくはこれを⾒てください
    • https://speakerdeck.com/kurochan/retail-dx-project

    View full-size slide

  5. 聞こえてくる会話
    • 🧑💻「xxxのシステムにアクセスするために出社しないといけないんですよね…」

    View full-size slide

  6. 聞こえてくる会話
    • 🧑💻「xxxのシステムにアクセスするために出社しないといけないんですよね…」
    • 👩💻「固定IPじゃないといけないらしくて、⾃宅のIPはすぐ変わっちゃうし…」

    View full-size slide

  7. 聞こえてくる会話
    • 🧑💻「xxxのシステムにアクセスするために出社しないといけないんですよね…」
    • 👩💻「固定IPじゃないといけないらしくて、⾃宅のIPはすぐ変わっちゃうし…」
    • 🧑💻「xxxのスマホアプリの検証にもIPアドレス制限が…」

    View full-size slide

  8. VPNサーバの需要があるらしい
    • 様々な企業やシステムと連携しつつ開発する業態
    • 何かしらの認証/暗号化 + IPアドレス制限という仕組みはよく出てくる
    • 個⼈的にはIPアドレス制限に頼りすぎずゼロトラストな環境は作っていきたい

    View full-size slide

  9. VPNサーバを作ってみる
    • VPNサーバの実現⽅法は⾊々ありそう
    • OSSもあるし、商⽤VPNもありそう
    • アカウントの棚卸し業務をやりたくない
    • サイバーエージェントには内製の認証基盤がある
    • OpenID Connectもあるよ
    • アプリ運⽤センターに異動してきてGo⾔語を書く必要が
    • 直近広告事業で6年半くらいScalaを書いていた
    • Go⾔語よく知らない…
    • Go⾔語の勉強がてら作ってみる

    View full-size slide

  10. 作ったものの概要

    View full-size slide

  11. WireGuard + OpenID Connect
    • 簡単に構築ができて、社内のID基盤とも連携できるのを⽬指す
    • 固定IP + 通信の暗号化のためにWireGuard VPN
    • 社内のID基盤を使った認証をするためにOpenID Connect
    • https://github.com/kurochan/oidc-wireguard-vpn/

    View full-size slide

  12. WireGuard
    • [CB ] WireGuard:次世代耐乱⽤性カーネルネットワークトンネル by Jason
    Donenfeld
    • https://www.slideshare.net/codeblue_jp/cb -donenfeld-ja

    View full-size slide

  13. WireGuard
    • https://www.slideshare.net/codeblue_jp/cb -donenfeld-ja

    View full-size slide

  14. WireGuard
    • Linux, Windows, iOS, Androidで動くOSSのVPN
    • 最近のLinuxだとカーネルに組み込まれています
    • 構築, 設定も簡単
    • 単体で使うのももちろんおすすめ

    View full-size slide

  15. OpenID Connect
    • OAuth . (認可) + 認証のしくみ
    • WEBサイトの間でのIDを連携するのに特化
    • シングルサインオンが実現できます

    View full-size slide

  16. OpenID Connect CIBA Flow
    • OpenID Connectは「Webサイト」に特化している
    • WireGuardのように、ブラウザアプリケーションではないアプリも認証したい
    • CIBA = Client Initiated Backchannel Authentication
    • クライアント側から認証を開始して、裏側(何かしらの⽅法)で認証/認可をする
    • VPN接続しようとしたらSlack経由で認証/認可のリクエストが⾶んでくるなど

    View full-size slide

  17. WireGuardに追加の認証を挟む
    • WireGuardは⾮常にシンプルなVPNなので、
    処理をフックするような仕組みはありません!💥
    • WireGuardで認証したあと、VPNの接続は確⽴したが、通信はブロックすると
    いう状態を作る
    • OpenID Connectで認証認可が成功したら通信を通す
    認証認可前

    View full-size slide

  18. WireGuardに追加の認証を挟む
    • WireGuardは⾮常にシンプルなVPNなので、
    処理をフックするような仕組みはありません!💥
    • WireGuardで認証したあと、VPNの接続は確⽴したが、通信はブロックすると
    いう状態を作る
    • OpenID Connectで認証認可が成功したら通信を通す
    認証認可後

    View full-size slide

  19. nftables
    • Linuxのネットワークファイアウォールであるnetfliterを管理する
    • iptablesを置き換えるフレームワーク
    • iptablesも裏側でnetfliterを使っている場合も

    View full-size slide

  20. WireGuard + OpenID Connect + nftables
    • なんかいけそう!
    • WireGuardのVPNが通ったとしても、退職や部署異動するとOpenID Connect
    で認可されなくなる
    • WireGuardのサーバ側の設定は定期棚卸しくらいでよくなる

    View full-size slide

  21. 使い⽅(ユーザ向け)
    • クライアントの設定する
    • PCもスマホもだいたい⼀緒

    View full-size slide

  22. 使い⽅(ユーザ向け)
    • VPN接続する

    View full-size slide

  23. 使い⽅(ユーザ向け)
    • Slackに通知がくるので認可する

    View full-size slide

  24. VPN経由で通信ができる

    View full-size slide

  25. 実装の紹介

    View full-size slide

  26. netlink
    • github.com/vishvananda/netlink
    • Linuxのネットワークインターフェイスを作ったり設定をいじる仕組み

    View full-size slide

  27. WireGuard
    • github.com/WireGuard/wgctrl-go
    • WireGuardのインターフェイスの詳細設定をする
    • 秘密鍵やVPNクライアントの公開鍵のペアなど

    View full-size slide

  28. WireGuardで新規接続を検知する
    • 最後にセッション(鍵交換など)を更新した時間がわかるので、その時刻の⽐較
    をすると新規接続を検知できそう

    View full-size slide

  29. 追加認証をしていない⼈の通信をブロックする
    • github.com/google/nftables
    • nftablesでフィルタルールを動的に制御する

    View full-size slide

  30. nftables
    • ルールの追加の例

    View full-size slide

  31. nftables
    • ルールの追加の例

    View full-size slide

  32. OpenID Connect CIBA Flow
    • github.com/okzk/go-ciba
    • OIDC CIBA Flowを簡単に実現できる
    • 社内IdPとここで連携しています

    View full-size slide

  33. OpenID Connect CIBA Flow
    • github.com/okzk/go-ciba
    • OIDC CIBA Flowを簡単に実現できる
    • 社内IdPとここで連携しています

    View full-size slide

  34. 追加認証をしていない⼈の通信を許可する
    • nftablesのセットを操作する

    View full-size slide

  35. 追加認証をしていない⼈の通信を許可する
    • nftablesのセットを操作する

    View full-size slide

  36. 追加認証をしていない⼈の通信を許可する
    • nftablesのセットを操作する

    View full-size slide

  37. gracefulなシャットダウン
    • プロセスを停⽌させた時に余計なネットワークの設定などが残っていてほしく
    ない
    • プロセス停⽌のシグナルをフックする
    • シグナルもチャネルとして扱える
    • シグナルを何かしら受け取るまで無限にブロックさせておいて、
    シグナルを受け取ったらシャットダウン処理をする

    View full-size slide

  38. 作ってみた感想
    • 便利そうな気がするので育てていきたい
    • yamlファイルで設定しないでDBを使うとweb UIとかから設定投⼊ができそう
    • Linuxと連携させる部分はScalaよりだいぶ書きやすかった
    • テストの書き⽅や⾒通しのいい設計はプロダクト開発をやりつつ
    勉強していきたい

    View full-size slide