第7回 必要最低限の権利の利用 重要性とその方法 NECラーニング 山崎 明子 必要最低限の権利の利用の重要性についてご紹介いたします。 セキュリティに配慮したアプリケーションでは、必要最低限の権利で実行することが強く推奨されます。 この回では、なぜ、必要最低限の権利での実行が必要なのか、それをどのように実現するのか?についてご紹介します。
必要なパワーはどちら? たとえば、貯金箱を壊すことを想像してみてください。その場合、トンカチがあれば十分、壊して中身を取り出すことができます。もちろん、ブルドーザーやパワーショベルを利用すれば、貯金箱を壊すことが出来るかもしれませんが、それでは、中身のお金が敗れてしまったたり、貯金箱がおいてあった机まで破壊してしまう可能性があります。 少なくとも、貯金箱を壊して中身を取り出すということが目的であれば、明らかに、トンカチだけでそのパワーは十分です。逆にそれ以上のパワーを持っていると、他の関係ないものまでも壊してしまう可能性があるからです。 これと同様で、システム開発の世界でも、本来そのシステムが行うために必要な権限のみをもって実行すればよいところを、余計な、より大きな権限を持って実行してしまった結果、本来行いたくない、あるいは行ってはいけない処理が実行できてしまうという問題が発生することになります。 具体的な攻撃例を考えてみましょう。
セキュリティの問題を 未然に防ぐことができる!? バッファ オーバーフロー クロスサイト スクリプティング DoS攻撃 SQLインジェクション システムダウン すでに前々回までに紹介した ・クロスサイトスクリプティング ・バッファオーバーフロー ・SQL インジェクション ・DoS攻撃 といった、攻撃。また、このような攻撃の結果、個人情報の漏洩、システムダウン、Webページの改ざんなど、発生する可能性のあるセキュリティの問題は、実は、そもそも、データを参照したり、変更したり、実行したりする権利がなければ、攻撃が失敗するため、発生しなかったのです。 では、具体的に見ていきましょう。 個人情報の漏洩 その他 さまざまな問題 Webページの改ざん
インターネット上の代表的な攻撃 ウイルス、ワーム、トロイの木馬 Webページの改ざん これらの攻撃に対し、実行するユーザーが大きな権限をもっていなければ、その攻撃は軽減することができます。それぞれ具体例を見てみたいと思います。
セキュリティでよく耳にする用語の確認 ウイルス ワーム トロイの木馬 マルウェア プログラムやファイルを経由して伝染するプログラム ネットワーク経由で自動的に伝染するプログラム トロイの木馬 通常のプログラムを装う悪意を持つプログラム マルウェア 上記のような悪意のあるプログラムの総称 それに先立ち、ここで、セキュリティ問題でよく耳にする4つの用語について確認しておきましょう。 すでに、ウイルス、ワーム、トロイの木馬をご存知の場合は、このスライドは飛ばして次のスライドからご覧ください。 まず、「ウイルス」とは、プログラムやファイルなどを経由して伝染するプログラムのことです。WordやExcelのマクロを悪用したマクロウイルスもウイルスの一種となります。差出人不明の電子メールの添付ファイルを開いたり、信頼できない提供元からダウンロードしたプログラムを実行したりすると、感染することがあります。 「ワーム」とは、ネットワーク経由で、自動的に感染するプログラムのことです。ファイル転送機能を悪用し、自己増殖をおこないます。主にソフトウェアの不具合を悪用して、ファイルを転送するため、適切な更新プログラムが適用されていないコンピュータをネットワークに直接接続すると感染する恐れがあります。 「トロイの木馬」とは、通常のプログラムを装った悪意を持つ独立したプログラムのことです。このトロイの木馬には、予想外の機能や隠された機能が含まれていて、この、隠された機能が損害をもたらします。そのため、信頼できない提供元からのプログラムは実行してはいけないのです。 なお、これらの悪意のあるプログラムは、総称して「マルウェア」と呼ばれています。
具体的な攻撃と権限 ウイルス、ワーム、トロイの木馬 Webページの改ざん ex. ILOVEYOU ex.IIS5の未チェックのバッファ システムディレクトリやレジストリへの書き込み Webページの改ざん ex.IIS5の未チェックのバッファ バッファオーバーフローを利用した攻撃 さまざまなプログラムの実行 では、具体的な攻撃と権限の関係についてみてみます。 数年前にOutlookを介して猛威を振るったトロイの木馬型のウイルスとして、あの有名なILOVEYOUワームがありました。このワームはシステムディクトリやレジストリに書き込みを行います。これは、ユーザーが管理者になっていなければ、あるいはシステムディレクトリやレジストリに書き込みに権限がなければ、その実行は失敗します。 Webページの改ざんの例としては、IIS 5.0の未チェックのバッファを狙った攻撃がありました。いわゆるバッファオーバーフローを利用した攻撃で、結果としてはさまざまなプログラムを実行させることができます。ここで問題になるのは、そこで実行されるプログラムがLocal Systemアカウントで実行される場合です。Local Systemアカウントには、コンピュータに対するフルコントロールが割り当てられていて、その中には当然Webページに書き込む権限も含まれています。 いずれにしても、プログラムを実行している権限がもっと低ければ、攻撃を受けたとしても、それは失敗するかあるいは被害を最小限にとどめることができます。
効果的な対策 必要な最低限の権限の特定 局所的な場所でだけ必要な権限の特定 不要な権限は持たない そこでだけ特権を取得し昇格 終了時に降格 対策の第一歩としては、まずその作業を行うための最低限の権限を特定します。そして、必要以上の権限を持たずに処理を実行します。 また、特権が必要な処理がある場合も、その特権が必要なのはどのタイミングかを見極めます。もし、ある特定の作業を行うときだけその特権が必要であるという場合には、そのタイミングだけ一時的に権限レベルを昇格し、その処理が終わったらすぐに降格するようにします。
部分信頼という考え方 .NET Framework 1.1 が登場するまで .NET Framework 1.1以降 すべての Web アプリケーションは完全信頼モードで実行 .NET Framework 1.1以降 部分信頼レベルを提供 完全・高・中・低・最小 必要な場面での権限の昇格 AllowPartiallyTrustedCallers 属性の利用 たとえば、.NET Framework1.1が登場するまでは、すべてのアプリケーションは完全信頼モードで実行されていました。しかし、.NET Framework 1.1以降は、完全以外に、高・中・低・最小などの部分信頼レベルを提供するようになりました。これにより、アプリケーションごとに必要最低限の権限で実行することが出来るようになりました。 また、局所的に権限レベルを昇格するための方法として、.NET Frameworkはそのための属性を提供しています。
部分的な昇格のためのしくみ アクセス許可の要求とアサート AllowPartiallyTrustedCallers 属性の追加 グローバル アセンブリ キャッシュへのアセンブリの追加 リソースに アクセスする プログラム リソースへの アクセス 部分信頼の Web アプリケーション セキュリティで 保護されたリソース この例では、アプリケーション全体としては、中程度の信頼レベルで実行が可能で、ある特定の瞬間だけ、特権を利用する必要があります。この時、最初から最後まで、その特権を利用できる必要はありません。アプリケーション全体としては、中程度つまり、Mediumレベルの信頼に設定しておき、必要な場面で権限レベルを昇格できるような仕組みが利用できればよいわけです。 .NET Frameworkでは、 アクセス許可の要求とアサート AllowPartiallyTrustedCallers 属性の追加 グローバル アセンブリ キャッシュへのアセンブリの追加 という設定を行うことによって、その時に必要な権限を取得し、特権による実行を一時的に行うことが出来るようになっています。 <trust level_"Medium" originUri_--/> アクセスには 特権が必要
システムアカウントの利用 Winowsサービスの実行 Windows XPとWindows Server 2003の新しいアカウント 従来は、Local Systemアカウントで実行 Windows XPとWindows Server 2003の新しいアカウント Local Serviceアカウント ネットワークリソースに対しては匿名ユーザ Network Serviceアカウント ネットワークリソースに対してはコンピュータアカウント また、システムアカウントにも、この必要最低限の権利の利用をサポートする機能があります。 Windowsサービスは、今までLocal Systemアカウントで実行してきました。ご存知の通り、Local Systemには非常に多くの権限が与えられています。そのため各種作業を十分行うことが出来ますが、その代わりに、本来実行する必要のない権限までも与えられています。ですから、Local Systemアカウントで実行されているサービスが悪用されると被害を大きくする可能性があります。 Windows XPと2003では、サービスの実行のための新しいアカウントが導入されています。 Local Serviceアカウントは、カレントコンピュータに対するいくつかのアクセス権をもち、ネットワーク上のリソースに対しては匿名ユーザアカウントとして動作します。 また、Network Serviceアカウントはカレントコンピュータに対しては、Local Serviceと同様のアクセス権を持ちますが、ネットワークリソースにアクセスする場合、そのコンピュータのアカウントでアクセスします。そのため、匿名ユーザを拒否しているシステムにもアクセスできる可能性があります。 このように、必要以上の権限を持たないことでセキュリティの問題を軽減することを心がけます。
まとめ 最もセキュリティで重要なこと 設計段階で考慮 とにかく、必要最低限の権限で実行するようにする 必要なときだけ特権を取得する それ以外は特権を持たない 設計段階で考慮 後付けで権限を削除することは難しい 最初から必要・不要な権限を切り分け 設計に組み込む まとめです。 セキュリティのさまざまな問題に対する対処として、必要最低限の権限で実行することは最も効果的な方法です。 とにかく、その作業に必用最低限の権限で実行するように設計します。また、そのシステムにおいて、ある特定の部分で特権が必要な場合は、その瞬間だけ、その部分でだけ特権を取得して、実行し、実行が終わったら特権を破棄します。 このようにすることで、攻撃の機会を少なくし、攻撃されたときの問題を最小限にとどめることが出来ます。 また、新しいOSや.NET Frameworkが提供する機能を活用することも検討してください。 また、これらを後付けで行うと、本来実行したい処理が権限不足で実行できない・・・という問題が発生する可能性があります。 ですから、最初からその作業に必要な権限として必要なものと必要でないものを見極めておきます。そして、設計の段階から権限の問題を組み込むようにしてください。
リファレンス 開発者のためのセキュリティサイト MSDNデベロッパーセキュリティセンター 開発者向け セキュリティ オンライン セミナー http://www.microsoft.com/japan/msdn/security/ 開発者向け セキュリティ オンライン セミナー http://www.microsoft.com/japan/msdn/security/seminars/ アプリケーションセキュリティの基礎 実践! セキュアなコード記述 Part 1 実践! セキュアなコード記述 Part 2 実践! .NET Framework を利用したアプリケーション セキュリティの実装 最後に開発者のためのセキュリティサイトをご紹介したいと思います。 こちらでは、開発者のためのオンラインセミナーが公開されています。ぜひ、こちらもご覧ください。