私は2つの目的を果たすサーバーを開発しています。それは、データを使用および保守する人々のためのCMSと、モバイルアプリがこのデータを取得するためのWebサービスです。 AWSクラウド上で(Java/JSPを使用して)Tomcat 6を実行しているDebianサーバーで実行されます。
現在、サーバーはログイン/パスワードを使用して両方のケースでユーザーを識別しています。モバイルアプリの場合、ログイン/パスワードはアプリ内であり、アプリのすべてのインスタンスで共有されます。誰かがクライアントのネットワークトラフィックを調べ始めると、URL、ログイン、パスワードが表示され、URLにアクセスしてCMSにログインできます(または少なくともログインサービスに対してブルートフォース攻撃を開始できます)。 。
CMSを保護するための最良の方法は何ですか?私のアイデアはおおよそ次のとおりです。
私が正しく理解している場合、CMSは2つのタイプのユーザーにサービスを提供します。
システムの設計によると、アプリユーザーは、自分のアプリがCMSにログインするために(アプリにハードコーディングされているため)使用するユーザー/パスワードの組み合わせを見つけることができます。したがって、アプリユーザーがCMSのデータを操作できないようにするonlyことは、ユーザーがアプリを使用しているという事実です。
あなたの当面の懸念は、CMSでの役割の分離です。 JSPでセッションを使用している場合、これは簡単です(おそらく、ユーザーのロールを表し、すべての.jspでロールチェックを行う別の列をユーザーテーブルに追加します)。
CMSのログインポイントに関しては、それを不明瞭にすると一部のボットがだまされる可能性がありますが、これでは不十分です。 iptablesを使用してブルートフォース攻撃を阻止するか、Tomcatのログを監視して疑わしい動作を禁止するある種のデーモンを実装することができます(SSHブルートフォーサーを禁止するために使用した私の例: https://github.com/epadillas/ ssh_banhammer.py )。
また、認証資格情報などの機密情報を扱う場合は、常にHTTPSを使用してください。
まず、SSL(https)を使用します。これにより、盗聴者がユーザーの資格情報を学習できなくなります。
サイト全体のSSL(https)の長所と短所は何ですか? 、 HTTPSを介したHSTSの追加のセキュリティ 、 HTTPSのみのサイトの実装者向けのガイダンス(サーバーサイド) 。
ユーザーがダウンロードするモバイルアプリのコードにパスワードを埋め込んでいる場合、それは少し奇妙であり、良い習慣のようには聞こえません。これは事実上、誰もが見ることができるようにWebサイトにパスワードを設定することと同じです。誰でもアプリをダウンロードしてバイトを確認し、パスワードを見つけることができます。プログラムのバイナリに格納されているものを秘密として扱うべきではありません。
ユーザーが自分のパスワードをアプリに入力した場合、それをアプリのプライベートストレージに保存し、すべての接続で再利用しても問題ありません。または、アプリの初回起動時に秘密鍵を生成し、対応するクライアント証明書をサーバーに(ユーザーのパスワードで認証されたSSL接続を介して)安全に送信し、クライアント証明書でSSLを使用してモバイルを認証します。以降のすべての接続でクライアントをサーバーに接続します(したがって、ユーザーは自分のパスワードを再度入力する必要はありません)。
CMSのコンテンツが一般に公開されることを目的としている場合、コンテンツを表示するためのパスワードは少し無意味であるため、削除する必要があります。モバイルアプリが一般に公開されており、モバイルアプリを持っている誰もがCMSのコンテンツを読むことができる場合、CMSのコンテンツは一般に公開することを目的としています。
ユーザーがデータを取得するために使用する各ユーザーの「APIキー」を生成できるため、データが盗まれたり侵害されたりしても、CMSへのアクセスに使用できず、そこからリセットすることもできます。
また、ログインエンドポイントにリダイレクトするのではなく、エラー(401 Unauthorizedまたは403 Forbiddenなど)で無効なログインに応答する必要があります。
CMSにオプションのセキュリティレイヤーを追加する場合は、多要素認証を追加することをお勧めします(例 Google Authenticator )。
これらとは別に、サーバーをブルートフォース攻撃(リクエストが繰り返し失敗した後にアドレスをブロックするか、ログインフォームにキャプチャを追加する)、さまざまな挿入(コード、特にSQLクエリを注意深くチェックする)および盗聴からサーバーを保護する必要があります(モバイルアプリとWebサービス間のトラフィックを暗号化し、CMSサーバーでSSLを使用します)。そして、明らかに、サードパーティのソフトウェアとライブラリを最新の状態に保ちます。
セキュリティ層は物理層からアプリケーション層に上がるため、環境は常に重要です。
Javaには独自のセキュリティがあるため、Javaとは異なります。 PHP、PythonまたはRuby。Javaはソースコードをコンパイルしており、静的言語です。OOアクセス修飾子はコードの一部の権利を分離し、ほとんどの場合、PHPで行うようにJavaでコードインジェクションを実行できないため、安全と見なされています。
基本的にそのようなアプリのために何をする必要があるか:
そして何より:
また:
また、聴衆が多い場合:
これは私がこの議論の結果決定したことです。