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.3k
3
Share
WireGuardとOpenID Connectの連携をGoで実装してみた
社内勉強会で発表した資料です
https://github.com/kurochan/oidc-wireguard-vpn/
Kurochan
August 19, 2021
More Decks by Kurochan
See All by Kurochan
ABEMAのバグバウンティの取り組み
kurochan
1
820
2026年の個人的テーマ: 「計算機を燃やせ🔥」
kurochan
1
130
つなぐ、届ける、変える- コンテンツ配信の最前線ト——ク
kurochan
0
140
サイバーエージェント流クラウドコスト削減施策「みんなで金塊堀太郎」
kurochan
4
3.2k
AWS Elemental MediaPackageと格闘🤼
kurochan
2
100
サイバーエージェントでのSlack活用事例 @ 2025
kurochan
5
240
15年入社者に聞く! これまでのCAのキャリアとこれから
kurochan
1
370
入門 電気通信事業者
kurochan
13
5.8k
AWS x さくらのクラウドのハイブリッドクラウドによる安価なフレッツ閉域網接続の実装
kurochan
9
6.2k
Other Decks in Technology
See All in Technology
10サービス以上のメール到達率改善を地道に継続的に進めている話 / Continue to improve email delivery rates across multiple services
yamaguchitk333
6
2.3k
Gaussian Splattingの表現力を拡張する — 高周波再構成とインタラクションへのアプローチ —
gpuunite_official
0
200
生成AI時代に信頼性をどう保ち続けるか - Policy as Code の実践
akitok_
1
510
サイボウズ、プラットフォームエンジニアリング始めるってよ ― プラットフォームチームの事業貢献と組織アラインメントの強化
ueokande
0
120
React Compiler導入の効果と運用の工夫
kakehashi
PRO
3
290
Directions Asia 2026 | Beyond Buildable AI Agents: Let’s Visualize Partner Value in the AI Era
ryoheig0405
0
130
続 運用改善、不都合な真実 〜 物理制約のない運用改善はほとんど無価値 / 20260518-ssmjp-kaizen-no-value-without-physical-constraints
opelab
2
270
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
4.5k
エムスリーテクノロジーズ株式会社 エンジニア向け紹介資料 / M3 Technologies Company Deck
m3_engineering
0
200
20260516_SecJAWS_Days
takuyay0ne
2
530
アプリブロック機能のつくりかたと、AIとHTMLの不合理な相性の良さについて
kumamotone
1
260
AWS運用におけるAI Agent活用術 / JAWS-UG 神戸 #11 LT大会
genda
1
310
Featured
See All Featured
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
290
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
230
What's in a price? How to price your products and services
michaelherold
247
13k
Darren the Foodie - Storyboard
khoart
PRO
3
3.3k
Heart Work Chapter 1 - Part 1
lfama
PRO
7
36k
Faster Mobile Websites
deanohume
310
31k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
A Modern Web Designer's Workflow
chriscoyier
698
190k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.4k
Fireside Chat
paigeccino
42
3.9k
How to train your dragon (web standard)
notwaldorf
97
6.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