Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
WireGuardとOpenID Connectの連携をGoで実装してみた
Search
Kurochan
August 19, 2021
Technology
3
3.1k
WireGuardとOpenID Connectの連携をGoで実装してみた
社内勉強会で発表した資料です
https://github.com/kurochan/oidc-wireguard-vpn/
Kurochan
August 19, 2021
Tweet
Share
More Decks by Kurochan
See All by Kurochan
AWS Elemental MediaPackageと格闘🤼
kurochan
2
30
サイバーエージェントでのSlack活用事例 @ 2025
kurochan
5
44
15年入社者に聞く! これまでのCAのキャリアとこれから
kurochan
1
240
入門 電気通信事業者
kurochan
13
5.6k
AWS x さくらのクラウドのハイブリッドクラウドによる安価なフレッツ閉域網接続の実装
kurochan
9
5.7k
GoでTCP Proxyを実装してみよう
kurochan
1
1.1k
サイバーエージェントの広告配信におけるIPoEトラフィックの概況
kurochan
0
490
スケールするというのはどういうことなのか
kurochan
14
4.9k
サイバーエージェントのGitHub Copilot導入と 開発生産性
kurochan
52
46k
Other Decks in Technology
See All in Technology
JAWS AI/ML #30 AI コーディング IDE "Kiro" を触ってみよう
inariku
3
350
Claude Codeは仕様駆動の夢を見ない
gotalab555
23
6.3k
Foundation Model × VisionKit で実現するローカル OCR
sansantech
PRO
1
340
MCP認可の現在地と自律型エージェント対応に向けた課題 / MCP Authorization Today and Challenges to Support Autonomous Agents
yokawasa
5
2.2k
GMOペパボのデータ基盤とデータ活用の現在地 / Current State of GMO Pepabo's Data Infrastructure and Data Utilization
zaimy
3
210
家族の思い出を形にする 〜 1秒動画の生成を支えるインフラアーキテクチャ
ojima_h
3
970
大規模イベントに向けた ABEMA アーキテクチャの遍歴 ~ Platform Strategy 詳細解説 ~
nagapad
0
210
Google Cloud で学ぶデータエンジニアリング入門 2025年版 #GoogleCloudNext / 20250805
kazaneya
PRO
20
4.7k
2025新卒研修・HTML/CSS #弁護士ドットコム
bengo4com
3
13k
「Roblox」の開発環境とその効率化 ~DAU9700万人超の巨大プラットフォームの開発 事始め~
keitatanji
0
120
LLMをツールからプラットフォームへ〜Ai Workforceの戦略〜 #BetAIDay
layerx
PRO
1
950
LLM 機能を支える Langfuse / ClickHouse のサーバレス化
yuu26
9
1.5k
Featured
See All Featured
What's in a price? How to price your products and services
michaelherold
246
12k
Intergalactic Javascript Robots from Outer Space
tanoku
272
27k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.5k
Why Our Code Smells
bkeepers
PRO
337
57k
Speed Design
sergeychernyshev
32
1.1k
Docker and Python
trallard
45
3.5k
Scaling GitHub
holman
461
140k
Typedesign – Prime Four
hannesfritz
42
2.7k
Side Projects
sachag
455
43k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.3k
Six Lessons from altMBA
skipperchong
28
3.9k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
46
7.6k
Transcript
WireGuardとOpenID Connectの連携を Goで実装してみた 株式会社サイバーエージェント AI事業本部 黒崎 優太 (@kuro_m )
黒崎 優太 • 株式会社サイバーエージェント AI事業本部 アプリ運⽤センター • ⼩売業界 x DXの事業をやっています
• バックエンドエンジニア 直近はAWSとかGCPとかセキュリティまわりの 仕事をしていました @kuro_m @kurochan #times_kurochan
VPNを作ってみました
VPNサーバが欲しくなった経緯 • AI事業本部内のDX本部に異動しました • 詳しくはこれを⾒てください • https://speakerdeck.com/kurochan/retail-dx-project
聞こえてくる会話 • 🧑💻「xxxのシステムにアクセスするために出社しないといけないんですよね…」
聞こえてくる会話 • 🧑💻「xxxのシステムにアクセスするために出社しないといけないんですよね…」 • 👩💻「固定IPじゃないといけないらしくて、⾃宅のIPはすぐ変わっちゃうし…」
聞こえてくる会話 • 🧑💻「xxxのシステムにアクセスするために出社しないといけないんですよね…」 • 👩💻「固定IPじゃないといけないらしくて、⾃宅のIPはすぐ変わっちゃうし…」 • 🧑💻「xxxのスマホアプリの検証にもIPアドレス制限が…」
VPNサーバの需要があるらしい • 様々な企業やシステムと連携しつつ開発する業態 • 何かしらの認証/暗号化 + IPアドレス制限という仕組みはよく出てくる • 個⼈的にはIPアドレス制限に頼りすぎずゼロトラストな環境は作っていきたい
VPNサーバを作ってみる • VPNサーバの実現⽅法は⾊々ありそう • OSSもあるし、商⽤VPNもありそう • アカウントの棚卸し業務をやりたくない • サイバーエージェントには内製の認証基盤がある •
OpenID Connectもあるよ • アプリ運⽤センターに異動してきてGo⾔語を書く必要が • 直近広告事業で6年半くらいScalaを書いていた • Go⾔語よく知らない… • Go⾔語の勉強がてら作ってみる
作ったものの概要
WireGuard + OpenID Connect • 簡単に構築ができて、社内のID基盤とも連携できるのを⽬指す • 固定IP + 通信の暗号化のためにWireGuard
VPN • 社内のID基盤を使った認証をするためにOpenID Connect • https://github.com/kurochan/oidc-wireguard-vpn/
WireGuard • [CB ] WireGuard:次世代耐乱⽤性カーネルネットワークトンネル by Jason Donenfeld • https://www.slideshare.net/codeblue_jp/cb
-donenfeld-ja
WireGuard • https://www.slideshare.net/codeblue_jp/cb -donenfeld-ja
WireGuard • Linux, Windows, iOS, Androidで動くOSSのVPN • 最近のLinuxだとカーネルに組み込まれています • 構築,
設定も簡単 • 単体で使うのももちろんおすすめ
OpenID Connect • OAuth . (認可) + 認証のしくみ • WEBサイトの間でのIDを連携するのに特化
• シングルサインオンが実現できます
OpenID Connect CIBA Flow • OpenID Connectは「Webサイト」に特化している • WireGuardのように、ブラウザアプリケーションではないアプリも認証したい •
CIBA = Client Initiated Backchannel Authentication • クライアント側から認証を開始して、裏側(何かしらの⽅法)で認証/認可をする • VPN接続しようとしたらSlack経由で認証/認可のリクエストが⾶んでくるなど
WireGuardに追加の認証を挟む • WireGuardは⾮常にシンプルなVPNなので、 処理をフックするような仕組みはありません!💥 • WireGuardで認証したあと、VPNの接続は確⽴したが、通信はブロックすると いう状態を作る • OpenID Connectで認証認可が成功したら通信を通す
認証認可前
WireGuardに追加の認証を挟む • WireGuardは⾮常にシンプルなVPNなので、 処理をフックするような仕組みはありません!💥 • WireGuardで認証したあと、VPNの接続は確⽴したが、通信はブロックすると いう状態を作る • OpenID Connectで認証認可が成功したら通信を通す
認証認可後
nftables • Linuxのネットワークファイアウォールであるnetfliterを管理する • iptablesを置き換えるフレームワーク • iptablesも裏側でnetfliterを使っている場合も
WireGuard + OpenID Connect + nftables • なんかいけそう! • WireGuardのVPNが通ったとしても、退職や部署異動するとOpenID
Connect で認可されなくなる • WireGuardのサーバ側の設定は定期棚卸しくらいでよくなる
使い⽅(ユーザ向け) • クライアントの設定する • PCもスマホもだいたい⼀緒
使い⽅(ユーザ向け) • VPN接続する
使い⽅(ユーザ向け) • Slackに通知がくるので認可する
VPN経由で通信ができる
実装の紹介
netlink • github.com/vishvananda/netlink • Linuxのネットワークインターフェイスを作ったり設定をいじる仕組み
WireGuard • github.com/WireGuard/wgctrl-go • WireGuardのインターフェイスの詳細設定をする • 秘密鍵やVPNクライアントの公開鍵のペアなど
WireGuardで新規接続を検知する • 最後にセッション(鍵交換など)を更新した時間がわかるので、その時刻の⽐較 をすると新規接続を検知できそう
追加認証をしていない⼈の通信をブロックする • github.com/google/nftables • nftablesでフィルタルールを動的に制御する
nftables • ルールの追加の例
nftables • ルールの追加の例
OpenID Connect CIBA Flow • github.com/okzk/go-ciba • OIDC CIBA Flowを簡単に実現できる
• 社内IdPとここで連携しています
OpenID Connect CIBA Flow • github.com/okzk/go-ciba • OIDC CIBA Flowを簡単に実現できる
• 社内IdPとここで連携しています
追加認証をしていない⼈の通信を許可する • nftablesのセットを操作する
追加認証をしていない⼈の通信を許可する • nftablesのセットを操作する
追加認証をしていない⼈の通信を許可する • nftablesのセットを操作する
gracefulなシャットダウン • プロセスを停⽌させた時に余計なネットワークの設定などが残っていてほしく ない • プロセス停⽌のシグナルをフックする • シグナルもチャネルとして扱える • シグナルを何かしら受け取るまで無限にブロックさせておいて、
シグナルを受け取ったらシャットダウン処理をする
作ってみた感想 • 便利そうな気がするので育てていきたい • yamlファイルで設定しないでDBを使うとweb UIとかから設定投⼊ができそう • Linuxと連携させる部分はScalaよりだいぶ書きやすかった • テストの書き⽅や⾒通しのいい設計はプロダクト開発をやりつつ
勉強していきたい
None