政府がプログラミング教育を義務教育として進めたり、ChatGPTにプログラムを書かせて、実行してみたりするなど、エンジニアでなくてもプログラムを書いたり触れる機会がとても増えたと思っております。
その一方で、技術的に詳細なことをやろうとすればするほど、問題になるのがセキュリティです。マルウェア感染や、機密情報漏洩など時には致命的なトラブルになることもあります。
この記事では技術職を名乗っているわけではないけどプログラミングを触る人向けに最低限抑えて欲しいと感じているセキュリティリテラシーを3選ピックアップしました。
目次
- この記事の対象者
- お断り・注意事項〜セキュリティはとても難しい世界〜
- 外部ライブラリの利用は慎重に
- 外部サイトのアクセスをする場合は迷惑をかけないように
- ID・パスワードなど機微な情報を取り扱う時は要注意
- さらなる発展学習として
この記事の対象者
なんらかのプログラムをかじったことがある方向けに書いてあります。全くプログラムを書いたことがない人は以下の記事もあわせて参照いただけると幸いです。
お断り・注意事項〜セキュリティはとても難しい世界〜
セキュリティはとても難しい世界です。非常に領域が幅広く細かい故に、これを極めようとするだけで仕事として食べていける世界であります。プロのIT技術者であっても、セキュリティ上リスクの高い業務を行う場合、セキュリティのプロにセキュリティ対策の助言を別途求めたり、第三者の監査を受けたりして開発や運用を行います。
また、日進月歩で常に変わっていくため今まで常識的にOKだったものがNGになることもあります。
そのため、今回私があげた3選も最低限これだけ抑えればOKというわけではなく、セキュリティのプロからみたら不十分であったりします。
この点ご了承の上閲覧いただけると幸いです。
私個人は、セキュリティリスク故にプログラミングはプロの技術者を名乗れるほど知識のある人しかやってはいけないということは反対で、むしろ社会全体の生産性の向上のために、プログラミングをできる人がもっと増えて欲しいと思っております。
そのため、末尾にさらなる発展としていくつか本やサイト、資格試験などを紹介していますのでよろしければこちらもご覧ください。
外部ライブラリの利用は慎重に
Pythonのpipによる外部ライブラリのインストール、Webページの外部ライブラリの利用は開発を便利にするものであり、今日のプログラミングにおいて難しいものを行おうとすればするほど必要になってきます。
# Pythonの外部ライブラリ利用例
$ py -m pip install Flask
#HTMLの外部ライブラリ利用例
<!doctype html>
<html>
<head>
<link rel="stylesheet" href="https://sample.com/style-library.css">
<script async src="https://sample.com/javascript-library.js"></script>
</head>
<body>
その一方で、以下の記事のように外部ライブラリを利用するという開発文化の隙をついて、外部ライブラリに悪意のある処理をいれてマルウェアを感染させたり外部への情報搾取をさせる例が相次いでいます。
加えてセキュリティとはややずれますが、法的リスクとして、外部ライブラリは無料で公開されていたとしても著作権やライセンスの問題があり、利用規約外の利用をすると法的責任を追求されるリスクがあります。
技術者としての実務経験上、完全な対策をするのはプロの技術者であってもとても大変な問題ではありますが、最低限以下のことを認識していただきたいと思っています。
自力で実装できるのであれば使わない
当たり前のことですが、なるべく自力で実装することを心がけたいです。全ての処理に対して書いた人が把握できたことになるので第三者の悪意のマルウェア感染懸念はありません。
また、初学者として、よくネット上にあるソースコードをそのままコピペして使うという方も多いと思いますが、最低限コピペする際には全ての処理が何をやっているか把握した上で使った方が安全です。動いているから大丈夫としてしまうと思わぬ痛手が起きる可能性があります。
使うとしても信頼性のおけるライブラリに限定する
外部ライブラリを採用するとしても信頼性のおけるライブラリに限定することが賢明です。
もっとも、ライブラリに関してはプログラミングの入門書やネット上の入門記事においてもやや不安のあるライブラリの紹介をしているものもあり、信頼性のレベルの判断をジャッジするのはプロの技術者でも骨の折れる仕事です。
会社組織であれば、セキュリティや情報システムの専門部門、利用規約やライセンス面であれば法務部門に利用可否を相談を行い、ガバナンスに沿って利用判断してくださいとしか言えないのが私の見解です。
定常的に使うプログラムであれば定期的に新しいライブラリのバージョンにアップデートする
セキュリティは日進月歩です。信用のおけるライブラリであっても、脆弱性が発見されたりします。そのため、ちょっとした一時的な利用ではなく定常的に使うようなプログラムの場合、定期的に新しいバージョンのライブラリにアップデートするようにしてください。
【WEBサイトを作る人限定】外部ライブラリは外部サイトからインクルードせず自サーバにダウンロードしておく
HTMLでWEBサイトを作る人限定になりますが、CSSやJavaScriptをインクルードする際に外部サイトから直接インクルードせずに、自分のサーバにダウンロードして使うことを推奨します。
仮に信用のおけるライブラリであったとしても、配信先のサーバが攻撃をうけて悪意のあるコードが埋め込まれてしまうリスクがあるためです。
# ---- あまり良くないパターン ----
<link rel="stylesheet" href="https://sample.com/style-library.css">
# ---- できれば事前にダウンロードしてこのように使いたい ----
<link rel="stylesheet" href="/style-library.css">
なお、外部ライブラリによっては仮にダウンロードしてそのまま動くとしても、利用規約違反になる可能性があります。必ず、利用規約上問題ないか確認したうえで対応してください。
外部サイトのアクセスをする場合は迷惑をかけないように
次に注意したいのが、外部のサイトからデータを取得したり、外部サイトの拡張ツールをつくるなど外部サイトと連携をするときです。
例えば、とあるニュースサイトから最新のニュース記事を100件取得するというような以下のようなプログラムを書くケースがあったとします。
以下のコードは架空のPythonコードですが大きな問題があります。もしも時間があれば考えてみてください。
# news.sample.comというニュースサイトからニュース情報の一覧を取得
result = requests.get("https://news.sample.com/api/")
article_list = []
#最新の記事件数を取得
for article_url in result.article_url_list
article_list.append(request.get(article_url))
正解は外部のサイトのサーバの負荷を考えずに、連続で外部サイトのサーバにアクセスしている点です。
Googleのような巨大なサイトであれば負荷対策をしているため問題ないかもしれませんが、小規模な企業のサイトの場合、過剰アクセスとなりシステムダウンを起こしてしまうかもしれません。
そうなってしまうと、プログラムを書いた人がセキュリティ事故の加害者となり、業務妨害などの法的責任が問われる可能性があります。
そのため最低限以下のことを認識して欲しいと考えています。
アクセス頻度をコントロールする
過剰なアクセス負荷にならないようにアクセス頻度をコントロールしましょう。先ほどあげたソースコードの場合、例えば5秒おきにアクセスするなどの修正をした方がいいです。
# news.sample.comというニュースサイトからニュース情報の一覧を取得
result = requests.get("https://news.sample.com/api/")
article_list = []
#最新の記事件数を取得
for article_url in result.article_url_list
#毎回必ず5秒待つ
time.sleep(5)
article_list.append(request.get(article_url))
利用規約を確認する
RSSや公開のWEBAPIであれば利用規約にアクセス頻度の許容範囲などが書かれていることが多いので必ず確認しましょう。
また、スクレイピングは法律上グレーのケースが多いです。ログイン不要サイトの場合、厳格に禁止してしまうとWEB検索にヒットしなくなるため、黙認しているケースもありますが、ログインが必須のサイトの場合、アカウント登録時に利用規約に同意をさせてスクレイピング禁止を合意させることで、明確に違法となる可能性が高いです。
そのため、心配であれば、当該サイトの運営者に確認を取ったり、法律の専門家に相談したりした方が安全です。
ID・パスワードなど機微な情報を取り扱う時は要注意
ログインが必要なサイトのアクセスをプログラムで行なったりする際に、IDやパスワードが必要なケースがあります。
特に共用でプログラムやPCを利用している環境の場合、IDパスワードの場合漏洩リスクがあります。
機密性の高いIDパスワードの取り扱いにおいては以下のことを認識しておくことが大事です。
ソースコードに直接記載しない
PythonやJavaScriptの場合、ソースコードはプログラム利用者にそのまま見られてしまいます。ソースコードに直接書くのは避けるようにしましょう。
IDパスワードをそもそもプログラムで扱わない
プログラムの実行環境を熟知していない初心者は、変数や入力フォームの利用も含めて、できればIDパスワードはそもそもプログラム上では扱わないことが無難です。
プログラムコードの仕様や設定によっては、ログとしてIDパスワードが排出されていたり、プログラム終了後もキャッシュとしてデータが残っている可能性があるからです。
一見難しい話かもしれませんが、例えば、ブラウザ処理の自動化を行うプログラムの場合、IDパスワードの入力が必要になった際は、そこでブラウザの自動処理を手入力にさせるなどで、自作のプログラムでIDパスワードの扱いを避けることはできます。
こういった細かいテクニックを知ってリスクのある処理を避けることもプログラミングにおいて重要なテクニックだったりします。
さらなる発展学習として
セキュリティリテラシーに心配がありさらに学んでみたいという方は、以下のような本を読んで勉強することをお勧めします。
なお、なるべく最近刊行されたもののなかで読みやすいものを選びましたがどれも2015年代刊行です。
セキュリティは日進月歩のため最新情報を知りたい方は、今回紹介する本の作者の徳丸先生や辻先生はX(Twitter)などで最新のセキュリティ情報を発信しているのでこちらも合わせてフォローすることをお勧めします。
なお無料公開のものだとIPAやJPCERT/CCにおいて以下のようなものが公開されてあります。
また、IPAの情報セキュリティマネジメント試験の勉強をしてみるというのもおすすめです。
IPAのセキュリティ関連の試験では、情報処理安全確保支援士が有名ですが、こちらは技術者、セキュリティのプロ向けです。
他方、今回紹介する情報セキュリティマネジメント試験は一般事業担当者向けに教養として身につけるために設定された試験となっております。
終わりに
最後まで読んでいただきありがとうございました。プログラミングにおけるセキュリティリテラシーに関して何か気づきがあれば幸いです。
Photo by: Nicole De Khors on burst