モバイルファーストの世界において、APIは異なるシステムを接続する上でますます重要な役割を果たしており、ほとんどのアプリケーションにとって不可欠なコンポーネントとなっています。アプリケーションの中核を成すだけでなく、APIはモバイルアプリのアクティビティに対する可視性の欠如を悪用する攻撃者の格好の標的にもなっています。
この記事では、モバイル API をこれらの攻撃から保護するために必要な手順を実行できるように、モバイル API のセキュリティ保護について知っておくべきことについて説明します。

モバイルAPIセキュリティの定義
モバイルAPIセキュリティは、APIがデータにアクセスし、システム境界外の他のサービスと連携する方法のセキュリティ確保に関わるあらゆる側面に適用されます。攻撃者がこれらの外部連携を手動で直接操作したり、アプリ内でトリガーされる方法を攻撃したりすることで、データやその他の機能にアクセスできるようになる可能性があります。
通常、モバイルAPIは従来のWebサービスと同様に構築および使用されます。RESTやSOAPなどの様々な標準プロトコルを使用し、HTTPインターフェースを介してインターネット経由でリクエストを受け付けます。モバイルAPIをテストする最も簡単な方法は、テストツールを使ってリクエストを生成し、サーバーから返されるレスポンスを分析することです。
これにより、APIエンドポイントがアプリに公開される前に、適切に保護されているかどうかを迅速に確認できます。攻撃者がアプリ内からデータを要求できる場合(例えば、すべての顧客レコードのダウンロードをトリガーするなど)、認証チェックが行われず深刻な被害が発生する可能性があります。
開発プロセスのあらゆるステップにセキュリティを組み込む
モバイルAPIを開発する際には、開発の初期段階からセキュリティへの影響を考慮する必要があります。APIの設計と構築においては、APIがアクセスする必要があるデータの種類、APIがどのように使用され、アプリの他の部分と統合されるかを考慮する必要があります。
このプロセスにおける重要なステップは、APIがアプリ内からトリガーされた場合にのみ必要なデータにアクセスできるようにすることです。認証されていないリクエストは処理されません。
パスワードのリセットや顧客情報の変更など、認証を必要とする機能は常に、アプリ自体の外部で実行されるサーバー側コンポーネントを介して処理する必要があります。
このようにすれば、攻撃者が手動または自動テストを通じてそれらを発見したとしても、他の攻撃を使用してそれらを悪用することに成功したとしても、認証されたデータを要求するアクセス権がないため、問題にはなりません。
アプリ外であってもすべてを保護します
モバイルAPIは、様々なシステムやアプリを接続する上で重要な役割を果たします。これらの橋渡しがなければ、攻撃者は重要なデータにアクセスできなくなります。つまり、APIを公開しているシステムは、その機能や、当然ながら公開されている情報を悪用しようとするハッカーの標的となる可能性があります。
API は、それを使用するアプリと同じシステムで実行する必要がないため、そのセキュリティが保証されるかどうかという懸念が生じています。
これらすべての外部エンドポイントを保護することは極めて重要です。攻撃者がこれらのエンドポイントのいずれかを介してアクセスに成功した場合、そのアカウントにリンクされているすべてのもの(モバイルアプリ自体、または他のWebサービス内、どちらでも、使用方法によって異なります)にアクセスできるようになります。
天気予報など、APIが他のリソースからデータを取得するケースでは、影響が1つのサービスに限定されるため、若干のリスクが生じる可能性があります。この場合、セキュリティ対策はアプリ自体の保護に重点を置き、顧客情報にアクセスする機能が悪用されないよう徹底する必要があります。
強力な認証で接続されたすべてのアカウントを保護する
モバイルAPIへのリクエストを認証する際は、ユーザーログインと同じ基準に従う必要があります。二要素認証はますます普及し、あらゆるオンラインシステムで必須となっています。つまり、すべてのリクエストには、送信元アカウントの識別子と所有証明が含まれている必要があります。
ほとんどの場合、これらの証明方法はアプリ内で処理されるため、攻撃者はアカウントにリンクされた携帯電話番号やメールアドレスなどのデバイスの詳細にアクセスせずに有効なリクエストを生成することはできません。
もちろん、この種の認証はAPIへのリクエストのみを保護します。攻撃者は依然として脆弱なエンドポイントを標的にできるため、他のWebサービスと同様に保護する必要があります。
つまり、攻撃者がリクエストの認証に成功したとしても、意図しないデータから逃れることができないように、適切なリクエスト検証を常に使用する必要があります。
バックエンドサービスの保護
モバイル API が別のシステムを介してインターネットに公開されているとしても、モバイル API を保護することがメインの Web サイトやその他のオンライン リソースを保護することよりも重要でないというわけではありません。
これらのエンドポイントに脆弱性があると、顧客情報が保存されているデータベースや支払いを処理するその他のオンライン サービスなど、バックグラウンドで実行されているリモート システムに対するより深刻な攻撃につながる可能性があります。
モバイル API のセキュリティが十分であると決して想定しないでください。これは、より価値の高い資産をターゲットにするための単なる足がかりに過ぎない可能性があるからです。
バックエンド インフラストラクチャの保護は、バックアップ ルーチンやキャッシュ エンジンなどの主要コンポーネントによって使用されるローカル データ ストアを含め、アプリから作成されたアカウントにリンクされているすべてのシステムを保護するために不可欠です。
多くの場合、これは Web サービスが攻撃から安全であることを保証するために実行するのとまったく同じ手順を伴いますが、モバイル API に関してはいくつかの違いを考慮する必要があります。
エンドポイント保護:
外部からの攻撃から各ポートを保護するために、IP/ポートの組み合わせで直接アクセスするのではなく、有線経由でのみアクセスできるようにします。
ログ分析:
調査中に異常なアクティビティを容易に発見できるよう、すべてのリクエストとレスポンスの詳細な監査証跡を確実に記録してください。これには、ネットワークプロトコル、HTTPヘッダー、レスポンスコードなどの一般的なパターンを含める必要があります。これにより、異常なアクティビティをフラグ付けしたり、ログデータの分析をある程度自動化したりできます。
適切な例外処理:
モバイル API 内で発生した例外を処理する方法には注意してください。例外によって、モバイル API の実装方法に関する手がかりが攻撃者に与えられる可能性があります。
エンドポイントがリクエストの認証に失敗した場合、単に一般的なエラーメッセージを返すべきではありません。そうすると、バックエンドシステムに関する情報が漏洩し、ハッカーが後から悪用する可能性があります。そのため、有用な情報が含まれないようにしてください。
将来の計画を立てる
急速に進化する市場におけるセキュリティは、サービスに影響を与える可能性のある変更に対応するために、あらゆる製品にとって優先事項である必要があります。
これは、セキュリティ テストが社内手順に限定されず、特に新しい機能の検討やまったく新しい API の設計時に、定期的に外部の専門家も関与させる必要があることを意味します。
内部セキュリティ テストでは多くの不愉快な驚きが明らかになることがあります。ただし、脆弱性はすでに導入されているため、すべての脆弱性が見つかる可能性は低いでしょう。
したがって、外部監査は、攻撃者よりも先に問題を発見するために重要であり、自動スキャンと、注意すべき兆候を知っている専門家による手動調査の両方を使用した侵入テストを含める必要があります。
あらゆる可能性のある欠陥を見つける必要はありません。結局のところ、簡単に悪用されてしまうため、発見しても意味がありません。そうではなく、簡単に悪用されない、あるいは悪用されるべきではない脆弱性を特定し、できるだけ早く修正することが重要です。
このプロセスは、メインウェブサイトやその他のバックエンドインフラストラクチャで既に実施されているものと変わりません。モバイルAPIについては、Amazon EC2などのコンテナ内でホストしない限り、セキュリティテストに特別な手順が必要になるとは考えにくいでしょう。
これは、サードパーティによって作成されたコンテナの使用を避けることを意味します。これらのコンテナを使用すると、内部で実行されているものすべてに攻撃者がアクセスできる可能性があり、また、コンテナ自体にセキュリティ上の欠陥が含まれている可能性もあります。
クラウドプロバイダーを切り替えても、アプリケーションコードのテスト方法に影響はありません。テストは、アプリの動作のみに焦点を当てるべきであり、アプリが実行される環境は考慮されるべきではありません。
また、将来に向けて計画を立てておくことも重要です。なぜなら、今後何が起こるかは誰にもわからないからです。特にプロバイダーが API を変更したり、廃業したりすると、状況はさらに悪化します。
これは、サードパーティのシステム (クラウド プロバイダーなど) に依存せずにコードのメンテナンスに注意を払い、利用可能なオープン ソース ソフトウェアを活用して、時間と費用の両方の面でメンテナンス コストを削減することを意味します。
後になって問題が必然的に発生し、変更を加えるのがより困難で、(あらゆる意味で)はるかにコストがかかるようになったときに、それを修正しようとするよりも、開発中に API のセキュリティを確保することに投資する方がはるかに効果的です。