カテゴリー: Computer

  • 4種類の信頼境界とセキュリティ構造 – 構造設計なしのセキュリティ対策?

    セキュリティ対策には設計図があります。少なくともアーキテクチャー図があります。しかし、何故かソフトウェアの場合は設計図もアーキテクチャー図も書けないセキュリティ対策が当たり前になっています。国際情報セキュリティ標準やセキュリティガイドラインを普通に理解すれば解ること、セキュリティ対策の基礎の基礎にも関わらず、です。

    これは一般開発者の問題というより、セキュリティ専門家やセキュリティに詳しい開発者の問題でしょう。セキュリティ問題は十分に複雑な問題であることに異論はないと思います。複雑な問題を解くにはアーキテクチャー(構造化)と適切な設計が重要です。設計どころかアーキテクチャーさえないのは明らかに問題でしょう。設計となると細かな仕様が必要となります。ここではアーキテクチャーだけでも十分なのでこれだけを考慮します。

    重要な事なので最初に書いておきます。セキュリティアーキテクチャー作る、は信頼境界線を書くことです。信頼境界の中に入れたモノ(入力やその他のモノ)であっても、普通は”何をしても安全なモノ”ではありません。安全性の為に更に詳細な入力検証が必要だったり、特定の権限を持つモノだけ許可したりするモノ、条件付きで信頼境界の中に入れるモノが普通にあります。また、信頼境界から出る時(出力)のセキュリティ対策は入力対策とは独立した対策です。これはよくある誤解なので注意しましょう。

    信頼境界は”防衛線”です。”防衛線”での防御はITセキュリティ対策に限らず、全てのセキュリティ対策共通した防御策です。”防衛線”の”中に在るモノ”は”信頼できるモノ”であることを可能な限り保証します。”防衛線”を越えて”入るモノ”と”出るモノ”は可能な限り安全性を保証します。これが全てのセキュリティ対策共通の基本です。

    ※ 信頼境界を越えて検証されたモノ(物/人/データなど)が「全面的に信頼できると誤解される」ことがよくあります。検証されたモノであっても、検証された範囲/内容までしか信頼できません。全面的に信頼できるモノはほぼ無い、とゼロトラストで考える必要があります。

    (さらに…)

  • VMware 12とKernel 4.13のパッチ

    VMware 14にはパッチがでるそうです。まだ12を使っているので以下のパッチが必要でした。13にアップグレードする意味はなさそうだったので12のままでしたが、そろそろ14にアップグレードする時期のようです。

    (さらに…)

  • ソフトウェアセキュリティのアンチパターン

    アンチパターンを知ることにより失敗を防ぐ。これはデータベース設計やソフトウェア設計で多く利用されている手法です。今回はソフトウェアセキュリティのアンチパターンを紹介します。

    このエントリは不定期にメンテナンスするつもりです。

    (さらに…)

  • ゼロトラストをより細かく分解する

    セキュリティを維持する為にはゼロトラスト、何も信頼しない所から始めて信頼できることを検証する、作業が必要です。ゼロトラストは信頼できるモノと信頼できないモノに分ける作業ですが、より細かく考える必要があります。

    ※ より細かく考える、とはいっても「細かい事だけ」では合成の誤謬にハマります。全体と詳細、両方をバランスよく「ゼロトラスト」することが大切です。

    (さらに…)

  • なぜセキュアなシステムが作れないのか?

    なぜセキュアなシステムが作れないのか?この問いは

    なぜバグフリーのシステムが作れないのか?1

    と同類の問いです。一定規模を超えると完全にバグ/問題がないシステムを作るのは非常に困難です。どのような状況でも正常に動作する完全にバグ/問題がないシステムは簡単には作れません。しかし、バグ/問題がないシステムが容易に作れないからといって「体系的な対策を行わない」のは賢明なアプローチではありません。

    このエントリではよりセキュリティ問題が少くなるアプローチを紹介します。これはセキュリティ標準やガイドラインに記載されている考え方をまとめたモノです。

    ポイントは

    • 構造化が大事
    • 基礎が大事
    • 目的が大事

    です。

    (さらに…)

  • PHP用入力バリデーションモジュール – validate

    ブログで紹介するのを忘れていました。PHP用の入力バリデーションモジュール validateを作りました。

    https://github.com/yohgaki/validate-php

    PHP開発MLでの議論用に作ったので、作りかけと言える状態ですが、一応動作し使えます。

    関数名はvalidate()の方が良いのでは?という意見があったので、名前は変更する予定です。valid()にしていた理由は”validate”だとあまりに一般的過ぎて、同じ名前の関数を定義しているユーザーがいるだろう、と予想したからです。自分のアプリやライブラリには名前空間を使うべきなので、モジュール関数はvalidate()にします。

    いろいろ意見があったのですが、やはり入力処理における入力バリデーションとロジック処理の混同がありました。

    入力処理における「形式的バリデーション」とロジック処理における「論理的/仕様的バリデーション」は別処理とした方が、構造的に優れています。この理由はまたの機会に書きます。

     

  • Python 2.7.14から学ぶセキュリティの基本

    Python 2.7.14が2017/9/16にリリースされました。Pythonの開発はバージョン3系に移行しており、2系はセキュリティ修正のみのリリースになっています。とは言ってもモジュールの変更を見るとバグフィックスやドキュメント修正も含まれているようです。

    Python 2.7.14のリリースはソフトウェアセキュリティの基本を学ぶには良い題材になります。

    (さらに…)

  • Railsユーザーが真っ先にするべきセキュリティチェック – Brakeman

    Railsユーザーがソースコード検査やWebサイト診断を受ける前に真っ先に使った方が良いセキュリティ検査ツールがあまり使われていないように感じています。

    Brakemanはかなり良くできたツールです。私は何年も前から補助的に使っています。

    (さらに…)

  • Fedora 26でVMware Workstationを利用する方法

    Fedora 26でVMware Workstation Pro 12を使うことは可能です。可能ですが、少し手間が必要です。

    追記: 2017/12現在、Fedora 27 + VMwareWorkstaion Pro 14を利用しています。この組み合わせの場合、普通にインストールするだけで利用できます。

    (さらに…)

  • Intel Graphics for Linuxの更新ができない

    先日、Fedora 25から26にアップグレードしました。特に問題なく使えているのですが、Intel Graphics for Linuxが更新されていない事に気がつきました。Intel Graphics for Linuxを更新する方法の備忘録です。インストール方法もほぼ同じです。

    (さらに…)

  • セキュリティ対策が論理的に正しいか検証する方法

    全てのセキュリティ対策は緩和策だと考えるべきです。これは個々の対策が完全であるか検証することが容易ではないからです。例えば、SQLインジェクション1つとっても本当に完全であるか?検証することは容易ではありません。プログラムが本当に思っているように動作するのか?検証する研究は、まだまだ研究段階です。

    しかし、容易ではないからといって諦める訳にもいきません。不完全であっても形式的な論理検証は容易にできます。

    (さらに…)

  • 知っておくべきITセキュリティ概念Top 10 〜ショート版〜

    ITシステム開発者必修のセキュリティ概念 Top 10です。ここで紹介する概念はセキュリティ設計やセキュアコーディングを行う上で欠かせないモノばかりです。順序はその基礎知識性、重要性、分かり易さで付けています。

    では開発者必修のセキュリティ概念 Top 10です。

    ※ 長くなったので短い版を作りました。ロング版はこちら

    (さらに…)

  • 当たり前?非常識?開発者必修のセキュリティ概念 Top 10

    ITシステム開発者必修のセキュリティ概念 Top 10です。さっと考えたので変更するかも知れません。これらの考え方や概念を理解していないと、ITセキュリティ標準やガイドラインなどで要求されているセキュアプログラミング/セキュアコーディングを効率的かつ効果的に利用することはできないでしょう。

    ここで紹介する概念はセキュリティ設計やセキュアコーディングを行う上で欠かせないモノばかりです。

    順序はその基礎知識性、重要性、分かり易さで付けています。では開発者必修のセキュリティ概念 Top 10です。

    参考:思いの外、長くなったのでショート版を作りました。

    (さらに…)

  • 本当にプリペアードクエリだけを使っていますか?

    'SELECT '.pg_escape_idetifier($_GET['col']).' WHERE '.pg_escape_identifier('tbl').' ORDER BY '.pg_escape_idetifier($_GET['col'])
    

    SQLクエリにはプリペアードクエリを使いましょう!と言われて久しいです。私もプリペアードクエリを積極的に使うべきだと考えています。

    • 多くの場合、速い
    • SQLパラメーターを分離して書くので「ついうっかり」が起こりにくい
      • 特に初心者は「ついうっかり」が多い

    しかし、「プリペアードクエリだけを使っていれば良いので、エスケープは要らない」という意見には賛成できません。なぜ賛成できないのか?コードを見れば分かります。

    何年か前に議論になった話題です。自分のエントリを検索して、たまたま見つけたのですが物がありました。

    例えば、入力バリデーションなしで以下のようなクエリは絶対に安全に実行できません。

    $result = pg_query_params('SELECT '.pg_escape_identifier($_GET['col]). ' FROM '.pg_escape_identifier($_GET['table']). ' WHERE id = $1', [$_GET['id']]);

    こんなクエリをそのまま書く人は居ませんが、プリペアードクエリ”だけ”ではインジェクション対策にならない事はSQLを知っていれば学生でも理解ります。

    特定カラムの抽出/ソート(これはエスケープでぼほOK)、テーブル指定をするクエリは当たり前に存在します。

    (さらに…)

  • DBMSの脆弱なAPI仕様は何時まで放置されるのか?

    広く使われているデータベースでもAPIが仕様として脆弱な物が長年放置されています。OracleやMS SQL Serverを利用している方ならよくご存知だと思います。

    (さらに…)