☀️

GitHubをやみくもに禁止せずにコード流出を防ぐ方法

2021/02/11に公開

仕組みでコード流出を防ぐ

前口上

業務で書いたコードの一部が流出する事件がありました。Utility系のスクリプトで基幹部分ではないとの噂ですが銀行というシビアリティーが高いシステムであった点、多重請負構造などの点で話題になりました。

一部企業では過剰反応があったようで一括でGitHub禁止というところも出ているようです。コードの流出を防ぐための施策としてGitHub一括禁止は妥当でしょうか?

GitHubとは

前提となるGitHubについて復習します。

GitHubはGitで管理されたコードを管理するサービスです。2018年にMicrosoftに買収されています。

ソフトウェアのバージョン管理にはGit、Mercurial、Subversionなどがありますが、GitHubはGitをサポートしたWebサービスです。Gitは単体としてもサーバーとして機能しますが、画面上で変更がわかりやすく見える点などからこういったサービスが利用されます。

GitHubの他にもGitLab, BitBucket, Giteeなどの競合サービスがあり、無料/有料、サービスの本スティングを任せるか/自前で運用するかの点などで違いがあります。GitHubは基本無料でホスティングを任せる通常のGitHubと自社サーバーで運用できるGitHub Enterpriseがあります。

コード流出すると何が起きるのか

ソフトウェアのコード流出は何が問題なのでしょうか。

模倣される

一般にソフトウェアプロダクトはハードウェアプロダクトに比べて設計図を手に入れた時の模倣が容易です。売っている商品を無料で使われれば赤字になります。

商用のコンパイラーや開発環境などがないどプログラムが実行形式にならないこともあるので必ずしも真ではないのですが、少なくともWeb開発においては誰でも入手可能な言語やミドルウェアを使って開発されることが多いです。

例えば化学プラントの設計図が流出したとしてどうですかね?もちろんそれ通りに部品を作ったりすればコピーを作ることは可能かもしれないですが設備投資の観点から個人がすぐに既存企業と同じことができるかというとそうではないです。

脆弱性をつかれる

言語モデルなどが進化すれば変わるかもしれないですが現状ソフトウェアのコードは人間が書いています。人間は完璧な生き物でないのでミスがあります

ソフトウェアのコードが流出するということは細かく調べれば欠陥を発見できる可能性があるということであり、それを利用すれば他人の口座からお金を引き出したりできる確率が上がります。

全てのソースコードに対してガチガチの管理をすべきか

さて、全てのソースコードに対して我々はガチガチの管理をすべきでしょうか?Noだと思います。

医療用のロボットを制御するプログラムとランダムで異なる結果を出す占いを出すプログラムではシビアリティーが違います。またソフトウェア開発企業の中にはソースコードやプログラムは無料でサポートで収益を賄っている企業もあります。

一流の人だけを雇う、教育する

ソフトウェア開発というのは設備投資が少なく人員への依存性が高いビジネスです。非IT業でもメールによる情報流出などはありますが、人間という不安定な生き物への依存性が高い点から極力リテラシーの高い一流の人だけ雇うというのが一番大事だったりします。

Gitはバージョンを管理するのに便利なツールですが、最新版のコードをコピーするだけなら使わなくてもよく、zipで固めてDropboxやGoogle Drive、USBメモリ、AirDropなどで転送、移動することはパソコンが使える人なら割と誰でもできます。

そういう意味で社内ルールを整備、入社時研修を徹底するのも同様に重要です。

内製化比率を上げる、開発会社依存からの脱却も同様に大事です。

  • MUST: ソースコードは資産であり、社外の人には教えない
  • MUST: 会社のリポジトリー以外にコピーしない(branchは個人repositoryでなく会社のrepositoryにpushする)
  • 場合による: 関連性の低い社内プロジェクトへのアクセスを絞る

極力クラウド版を使用する

Gitの管理サービスにはホスティング版もあり、一定の規模に応じて自前で運用するというのも選択肢の一つです。なぜ一定の規模かというと運用コストがかかり専任のインフラ担当が必要になるからです。

GitLabは毎月新しいバージョンを出しており、脆弱性対応に即座に対応できないならそれ自体がリスクです。ホスティング版だから全て安全というわけではありません。

IT企業はラーメン屋の数より多いともいいますし、1企業あたりの人数は他の業種と比べて低くなりがちです。人数が少なくても事業が効率よくまわせるからがSaaS利用の理由であり、そのメリットを享受できなくなるのは本末転倒でもあります。

例えばエンジニアが300人以上いるZOZOでは比較の結果、クラウド版を利用する方がアドバンテージがあるとの結論を出しています。少なくともエンジニア数十人レベルまでは極力クラウド版を使用でいいのではないでしょうか。

  • 極力クラウド版を使用し、開発チームの規模に応じてホスティング版を検討する

(企業規模によって)BYOD禁止、会社側がPCを支給する

Bring Your Own Deviceとは会社がパソコンを用意せず自前の端末を利用することを指します。プロジェクトによっては外部開発会社やフリーランスの方も開発に参加していることもあります。

端末を用意しなくてすぐ参入してもらえるというメリットはありますが、そこは会社のコントロールが及ばない部分でもあります。会社側がPCを支給する というのは端末のバージョンを統一できたり、事前に統一スクリプトを流せたりと管理のレベルが上がります。一定規模以上では検討してもいいと思いますが一方で、予算が限られていると端末スペックが下がってしまう場合もあるので注意が必要です。

あまり事例は探せなかったのですが例えばglobalのGit Hooksを仕込んでおけばpushできるrepositoryをorganizationのものに絞ることは技術的に可能な気がしています。今回の事件ではコードの一部を自分のrepositoryにpushしたわけですが、キッティングを統一することでそういったミスを防ぐことはできると思います。OSSを公開している企業では多少のallowlist機構は必要かもしれないです。

同じく既成ツールを見つけられなかったのですが、localにgitのproxyを作ってみるというのも制御可能な範囲を増やす一つの方法かもしれません。

  • (企業規模によって)BYODでなく会社側が端末を支給する
  • Git pushに制約をかけ仕組みでセキュリティーを担保する

出社強制は極力しない

シビアな情報を扱う業種の場合、例えばインフラやデータサイエンティストとそれ以外の職種とでアクセスコントロールを変えることもあります。コードを流出させない方法の極論はインターネットにつながない、USBポートなどを封じるだと思います。

メーカーのハードウェア開発などで知見の多くが社内に依存する場合もなくはないですが、IT業界は進化がはやくWebの情報なしで開発を行うというのは多くの場合現実的ではありません。

人手不足の業界ですから地方在住の方をいかに採用できるかが事業をドライブさせるために必要なこともあります。出社前提で社内ネットワーク限定というのは生産性の観点からつらく最後の選択肢だと思います。

  • 出社強制、社内ネットワーク限定は最後の手段

流出してしまったことをどう検出するか

最後に流出を検知する方法について述べたいと思います。

APIのKey流出を検出するsecret scannningという機構は存在しますが範囲が限定的ですね。

単純ですがCopyrightや簡易LICENSE文をファイルに埋め込むは一つの方法だと思います。個人でサンプルリポジトリを公開されている方が自分の名前で検索して使われている範囲を調べてニヤニヤしているという例を聞いたことがあります。

ネイティブアプリの開発ではIDEがファイル生成する際に自動で付与されたりします。IDEを使わない場合ではあまりポピュラーではないですがgit hookで自動付与は技術的には可能です。

  • Copyrightをファイルに仕込んで流出を検知

その他

GitHubは好きなサービスではありますが、一辺倒も危険なので他のサービスも競い合って欲しいとは思います。また国営サービスをGitHubで管理すれば国防上の弱点になることはあるかもしれません。

例えば中国ではGiteeが出ていますし、本来Git系のサービスはコンテンツヘビーなサービスと違ってローカライズコストが低く日本版GitHubが出てもいいのではという気もしています。

最後に

コードの流出を防ぐための施策としてGitHub一括禁止は妥当ではないと思います。リスクとメリットをしっかり比較してクラウドサービスを使っていきましょう。

Discussion