セキュリティに関する世界観です。暗号も参照のこと。
エンジニアにとって、必須の作業がもしあるとしたら、それは「セキュリティパッチ情報を追いかける」ということです。
セキュリティパッチの情報を集めて、もし今運用している環境に影響しないかを知るということは、エンジニアにとって「必須の作業」です。
たとえば下に書いたLog4Shellの脆弱性などは、知らないということは絶対に許されません。
脆弱性情報データベースとして、有名なのはCVEです。最新の情報はTwitterアカウントがあります。
アメリカの場合NVD、日本の場合JVNなどがあります。
その他のリンク集などは以下が参考になります。
僕が思いつく限りで、簡単にできるセキュリティ対策としては、
セキュリティ対策 | 説明 |
---|---|
セキュリティ更新 | 使うサーバーやシステム、コンピュータなどについて、 セキュリティホールを埋める。 サポートの切れたWindowsや昔のRed Hat Linuxを使わず、 アンチ・ウイルスソフトウェアのパターンも最新にする。 WindowsだけではなくJavaなども最新にする。 |
重要なファイルの管理 | スパイウェアから盗まれるのを防ぐため、 個人情報やパスワードの入ったデータファイルを、 ネットワークに繋いだパソコンに置かない。 |
強力なパスワード | Webサービスがハッキングされた時に備えて、 GoogleのようなWebサービスに、 容易に推測できるパスワードを使わない。 |
暗号化通信 | 通信機器などの中継地点から通信を傍受されないように、 暗号化されていない通信で、 大切な情報をやり取りしない。 |
ウイルスを入れない | ウイルスやデータを盗むスパイウェアの入ったフリーソフトを インストールしない。 ウイルス対策ソフトウェアを入れる。 |
不正サイトを見ない | 不正サイトを見ない。怪しいリンクを踏まない。 怪しいサイトではパスワードやクレジットカード番号を入力しない。 |
怪しい添付ファイルを見ない | Windowsなどで、不審なメールや不正マクロの入った 添付ファイルを開かない。 |
バックアップ | バックアップはバランスが大切。 盗まれて困るようなUSBメモリなどに大切なデータを保管しないと同時に、 どこかのマシンが壊れても別のマシンにデータがバックアップされるようにする。 |
機器のセキュリティ | セキュリティの甘いマシンや通信機器をネットワークに繋がない。 Windows XP以前のOSはネットワークに繋がないようにする。 |
などがあります。
企業やビジネスで言えば、
セキュリティ対策 | 説明 |
---|---|
メールのセキュリティ | セキュリティの甘い会社とはメールでやり取りをしない。 |
機器のセキュリティ | セキュリティの甘い機器は使わない。 |
持ち出し禁止 | 重要なデータや個人情報を社外に(たとえ関連企業や家庭のパソコンでも)持ち出さない。 USBディスクは盗まれる可能性があるため、社内で共有しない。 |
システムのアップデート | 前時代のシステムは常にアップデートを行う(古いRed Hatなどを使ってはいけない)。 |
システムのネットワークを遮断 | システムを構築する際に、インターネットを使わず、社内ネットワークやローカル通信を使う。 |
バックアップ | バックアップをきちんと取る。 |
専門家 | OSなどのセキュリティ対策(SELinuxなど)が分かる専門家に相談する。 |
これらは、公益性の高い職場やサービスであればあるほど、重要性を増してきます。
ですが、このようなセキュリティ対策を行っていても、「関連する末端の企業のセキュリティ」が甘ければ、そこからウイルスが入ります。このウイルスは入った時点では、見つからないように潜伏しているため、存在が分かりません。突如として大量にサーバーを破壊し、復旧しようとしても別のパソコンから感染し転移するため、復旧も難しくなります。
オリンピック大会の選手や観戦者の認証を行う認証サーバーなど、本当にセキュリティ対策をしていても、何百とあるセキュリティ攻撃の「どれかが入り込む」ことで、セキュリティは木端微塵に破られてしまいます。ピョンチャンオリンピックでもこうしたセキュリティ攻撃が行われました(IT社会を参照のこと)。
忘れがちなのが、パソコンだけではなく、スマホやタブレットのセキュリティ。パソコン同様に危険なので、パスワードをきちんとかけて、他人に簡単に渡したりしないこと。今からの時代大切な媒体になっていくでしょう。スマホはモバイルで携帯して使うため、パソコンよりも盗まれやすく、駅などに放置すると盗まれた時が大変で、紛失することも多いため、十分注意して使いましょう。
サーバーのセキュリティ対策の基本は、「アップデート」「ミニマリズム」「認証制限」そして「監視」です。
まず、アップデート。サポートされているOSを使うこと。常にシステムをアップデートすること。
次に、ミニマリズム。不要なサービスを起動しないこと。不要なパッケージをインストールしないこと。
次に、認証制限。ログインできるユーザーを制限すること。SSHのログインを制限すること。
最後に、監視。ロギングとモニタリングでネットワーク通信を監視すること。ログをできるだけ残す設定にすること。定期的にウイルススキャンを行うこと。
また、chkrootkitの導入なども行いましょう。
詳しくは以下の記事が参照になります。
Linuxでは、システムのログは/var/log/syslogに出力される。またtopコマンドを使うことで、システムのプロセスやスレッドの状況を監視できる。
initとデーモンやSSH設定やUNIXシステム管理(システムロガー)やLinuxネットワーク(モニタリング)やrootkitを参照のこと。
Googleによる追跡・トラッキングに反対するDuckDuckGoにより、Linuxのセキュリティやプライバシーを守る方法が以下に投稿されています。
ちなみに、以下にWindows/Mac向けのプライバシー保護情報があります。普通のWindowsユーザーはこちらも参照のこと。
DuckDuckGoも参照のこと。
セキュリティ対策において、「バッドプラクティス」と呼ばれる間違った方法をリスト化したCISAによれば、バッドプラクティス(を行わないための対策)は「サポートがされなくなったOSやソフトウェアを使わないこと」「既知・固定・デフォルトのままのパスワードを使わないこと」「単一要素認証を使わないこと」です。
認証も参照のこと。
最近、Linuxは少しずつセキュアになっています。
たとえば、先日リリースされたDebian 10では、強制アクセス制御のAppArmourがデフォルトで有効になり、またDebianでもようやくセキュアブートがサポートされた。UEFIのセキュアブートは多くのディストリビューションで有効になっており、PCの起動時にあらかじめデジタル署名のあるソフトウェアしか実行できなくし、ルートキットなどがOSより早く実行されるのを防ぐ。
7payやビットコインなどの不正利用などの問題で、既存のシステムを使ってビジネスサービスを行う際のセキュリティ向上はとても大きな課題である。時代は、LinuxのようなOSのレベルでセキュリティを向上させ、「絶対にハッキングが起きなくする」ことを求めている。
また、Debian 10では新たにRustによるバイナリを追加し、Waylandが標準で有効になった。こうした足場から、少しずつセキュリティを高めてもらいたい。
パケットフィルタリングとは、ファイアーウォールを用いて、パケット通信に介入し、アクセスの制御を行う仕組みのこと。つまり、不正な通信をブロックすること。
これに対してVPNとは、インターネット上に仮想のプライベートネットワーク(専用回線)を作ること。つまり、社内だけの専用のネットワークを作ること。VPNの中での通信をVPNの外から傍受することはできない。
ファイアーウォールでパケットフィルタを設定し、VPNを設定することで、社内・家庭内のネットワークのセキュリティを向上できる。
Linux ファイアウォールとiptablesも参照のこと。
インターネットVPN(インターネットを使用するVPN)には、SSLを使ったSSL-VPNと、IPSecを使ったIPSec-VPNがある。
IPSecはパケットの暗号化や改竄防止の機能を提供するプロトコルで、IPSec-VPNで使われている。
ほかに、インターネットを使用せず、閉ざされた専用のネットワーク回線を使用する、IP-VPNなどがある。
暗号も参照のこと。
2023.05.07
2023.05.08編集
手軽にVPNサーバを立てたいなら、Raspberry PiにPiVPNを導入するといいかもしれない。自宅のネットワークに外から接続できる。
Raspberry Piも参照のこと。
2023.05.27
トンネリングとは、インターネット回線上に仮想のトンネルを作成し、送信者と受信者をトンネルで繋ぐ仕組みのこと。
トンネルの内部に、外部から遮断された「見えない通り道」を作る。
暗号化とともに使い、トンネルを相互に繋ぐことで、あたかも専用のプライベートネットワークであるかのようにVPNを運用することができる。
Linuxネットワーク(さまざまなコマンド)を参照のこと。
侵入検知とは、その通り侵入を検知する技術。
異常な通信などを発見し、「どうすれば防げるのか」だけではなく、「今侵入されているかどうか」を監視し、検知し、通告する技術である。
IDSは侵入検知システムと呼ばれ、侵入を検知するシステム。
これに対してIPSは侵入防御システムと呼ばれ、侵入を検知するだけではなく防御する。
UTM(Unified Threat Management)は、IDSとIPSの機能を備えている統合型のセキュリティ製品。
ソフトウェアやシステムのセキュリティを強化するためには、ハッカーと同じことをしなければならない。実際に既知の技術を用いて侵入を試みることを「ペネトレーションテスト」という。これはLinuxでもよくやられているセキュリティ強化の手法である。まさに「善意のハッカーと悪意のハッカーは紙一重」である。善意のハッカーのことをホワイトハット、悪意のハッカーのことをブラックハットという。
サイバー攻撃についてはPHPセキュリティを参照のこと。
IPAのセキュア・プログラミング講座で、さまざまなセキュリティ対策が紹介されています。
Linuxにおけるセキュリティ技術について、本格的に学びたい方は、LinuCレベル3 303試験でセキュリティの領域に関する資格試験を実施されているため、情報セキュリティスペシャリスト試験(略称SC)などと合わせて勉強されると良いと思います。
基本情報やLPIC/LinuCを参照のこと。
(「徹底攻略 応用情報技術者教科書 平成30年度」を参考に執筆しました。)
PHPなどの言語によって対策可能なセキュリティ攻撃については、PHPセキュリティに記述しているが、それ以外の主なサイバー攻撃についてを説明する。
攻撃 | 説明 |
---|---|
バッファオーバーフロー攻撃 | バッファよりも大きなサイズのデータをポインタなどに代入することで、 バッファオーバーフローを起こしてシステムの大事なデータを書き換え、 不正なプログラムを実行させる攻撃。 |
DNSキャッシュポイズニング | DNSサーバのキャッシュを書き換えることで、 不正なサイトのURLを正常なサイトに見せかけて、不正サイトに誘導する攻撃。 |
DoSあるいはDDoS攻撃 | たくさんの「踏み台」と呼ばれるマシンにウイルスを感染させ、 それらのマシンからひとつのサーバにリクエストを送りまくることで、 サーバをダウンさせる攻撃。 |
フィッシングサイト | 不正なサイトを正常なサイトに見せかけて作り、 パスワードや暗証番号・クレジットカード番号などを入力させ、盗み取る攻撃。 |
ランサムウェア | コンピュータ内の大事なデータを暗号化し、 「暗号化を解いてほしければ金を払え」と、 暗号化の解除に対して金銭の支払いを要求してくる攻撃。 |
このほか、パスワードを不正に入手するパスワードクラックという攻撃がある。辞書を使うものを辞書攻撃、総当たりで力技で解析するものをブルートフォース攻撃、ほかのサイトで入手したパスワードと同じパスワードを使うものをパスワードリスト攻撃などと言う。
また、ウイルスやマルウェアの感染についても、踏み台を通じて行う場合が多い。ウイルスに感染した踏み台から、さらに大量のウイルスメールを不特定多数に送り付け、間違ってクリックした人間をどんどんウイルスにかける。また、ウイルスと同等の、それ自体が悪いことをするのではなく、情報を不特定多数に拡散する目的の「スパムメール」と呼ばれる攻撃があり、大量の人間にURLの宣伝をすることで有料サイトや不正サイトなどへと誘導する。
2023.01.31
暗号を参照のこと。
認証を参照のこと。
アンチウイルスを参照のこと。
主なセキュリティ攻撃について詳しくはPHPセキュリティを参照のこと。
Linuxにおけるファイアーウォールについては、Linux ファイアウォールとiptablesを参照のこと。
UNIXシステム管理(ユーザーとパーミッション)やSELinuxやAppArmorを参照のこと。
監視・モニタリングについてはLinuxモニタリングも参照のこと。
以下の書籍・ページが参考になります。
Torはインターネット通信において接続経路情報を匿名化する技術。
The Guardian Projectはオープンソースのセキュリティ関連の団体で、Torプロジェクトと協力関係にある。
後日注記:Torは、インターネットでハッキングを試みる悪意あるハッカー集団によって使われることが多い技術。多くの組織的なハッカーが、自らの国や組織を隠すためにTorを使用している。
プライバシー保護ブラウザも参照のこと。
今、世間を騒がしているLog4jの脆弱性(Log4Shell)により、インターネットは闇の世界になるかもしれません。
Log4jは、Javaのライブラリのひとつで、オープンソースソフトウェアです。使う目的は、ログを取ること。Javaでは、ログを吐き出す目的で、ほとんどの場合Log4jが使われています。
見つかった脆弱性は、Log4jに実装されていた、ログを吐き出すだけではなく、特定の記法でログを吐き出す命令が来た時に、LDAPとJNDIを用いて、インターネット上のclassファイルをダウンロードして実行するという機能による脆弱性です。
そもそも、ログを取るだけの目的であれば、このような機能は必要ありません。ですが、Log4jでは、特定の構文が来た時に、それを自動的に解決して実際の値に置き換えるマクロ的な構文が用意されていて、この中に、LDAPとJNDIに関する命令があり、これをログに記録させようとした場合、インターネット上から悪意あるプログラムをダウンロードして実行してしまうということが分かったのです。
Log4jは、とても広く使われているソフトウェアです。そのようなソフトウェアに、このような一般的大多数には必要とされないような機能が実装されていたことがまず問題です。Javaの多くのモダンなプロジェクトは、Log4jをロギングのために使っています。
そして、この脆弱性を通じてハッキングを行うのは極めて簡単です。ログに記録させることさえできれば構わないからです。ログは、入力フォームなどを実行しただけでも、あるいはリクエストが来ただけでも記録されます。この中に、不正な文字列を仕込ませておけば、あとはプログラムを勝手にダウンロードさせて実行できます。データを破壊することも、盗むことも、ウイルスに感染させてバックドアを仕込むことも、なんでもやりたい放題です。
そして、対象範囲が広すぎます。多くのJavaプロジェクトでLog4jをロギングのために使っています。たとえば公開サーバーのサーバーサイドのバックエンドに使われているかもしれません。自分でロギングに使わなくても、依存ソフトウェアがロギングのために使っていればアウトです。依存ツールすべてを調べ上げるのはとても困難です。
Log4jはApacheプロジェクトの傘下であり、既にパッチが提供されています。一度のパッチで済むはずが、さらに問題が見つかって今のところ(2021.12.20)では3つの新しいバージョンが公開されています。Log4jの脆弱性を後回しにすることは、家のドアに鍵をかけずに公開しているのと同じです。すぐにパッチを当てるなどの対処をおすすめします。
僕は、システムのセキュリティを向上させるために、ユーザーが明示的に行ったプログラムの実行以外は、サンドボックス環境でしか実行できないようにするなどの方法が考えられると思う。
自分でコマンド操作やGUI操作を行う場合以外には、プログラムがシステムのデータを書き換える際に、必ず許可を求めなければいけないようにし、許可がない場合はファイルの変更やプログラムの実行ができないようなサンドボックス環境でプロセスが実行されるようにすればいい。
そうすれば、ウイルスなどが入り込んで不正な処理を実行することもできなくなり、システムのセキュリティホールをつかれたとしても、重要なファイルが破壊されたり奪われたりということを減らすことができるだろう。