モバイルアプリケーションにハードコードされたAWSキー
本記事では、モバイルアプリケーションでAWSのサービスを利用する際に、AWSのアクセスキーをどのように管理すべきかを解説します。
本記事では、モバイルアプリケーションでAWSのサービスを利用する際に、AWSのアクセスキーをどのように管理すべきかを解説します。
顧客がクラウドに消極的になる主な理由の一つは、データの管理と、チェーン全体のセキュリティです。この懸念に対処するため、AWSは責任共有モデル(Shared Responsibility Model)において、セキュリティ制御を扱う際のAWSと顧客の間の境界を定義し、各レベルでAWSのサービスを利用する際に従うべきセキュリティのベストプラクティスを示しました。
AWSの責任共有モデル
簡単に言えば、AWSはクラウド「の」セキュリティ(オレンジ色の部分)に責任を負い、顧客はクラウド「における」セキュリティ(緑色の部分)に責任を負います。したがって顧客は、ユーザーの管理と、ユーザーがサービスにどのようにアクセスするかの管理に責任を負います。
AWSにプログラムからアクセスする場合、アクセスキーを使って自分自身とアプリケーションの身元を証明します。アクセスキーを持っている人は誰でも、あなたと同じレベルでAWSのリソースにアクセスできます。そのため、いかなる場合もアクセスキーを公開してはいけません。Uberはこの教訓を忘れないでしょう。 https://awsinsider.net/articles/2017/11/21/uber-aws-data-breach.aspx
コードをgitリポジトリにアップロードしている場合は、git-secretsを使えます。git-secretsはアクセスキーをチェックし、gitリポジトリにコミットされるのを防ぎます。
モバイルアプリケーションからAWSのサービスにアクセスしている場合、アクセスキーをハードコードすることは高リスクの脆弱性です。コードを調べた誰かによってシークレットが侵害される可能性があるためです。
アプリケーションにキーがハードコードされているかどうかを確認するには、モバイルアプリケーション(AndroidとiOS)にハードコードされたアクセスキーを検出するOstorlabのセキュリティスキャナーを使えます。
この例では、AWS S3に画像をアップロードするAndroidアプリケーションを使います。
最初の例では、アップロード関数の中でハードコードされたキーを直接使っています。
// KEY and SECRET are gotten when we create an IAM user above
String KEY = "AKIAIUG2TRZ99XFZONBA";
String SECRET = "31eJbrNp5OJgrbvxTyzz38MUZ/MBMNVkG0irtd/2";
BasicAWSCredentials credentials = new BasicAWSCredentials(KEY, SECRET);
AmazonS3Client s3Client =new AmazonS3Client(credentials);
TransferUtility transferUtility =
TransferUtility.builder()
.context(getApplicationContext())
.awsConfiguration(AWSMobileClient.getInstance().getConfiguration())
.s3Client(s3Client)
.build();
2つ目の例では、リソースの設定ファイル内のキーを使っています。
<?xml version="1.0" encoding="utf-8"?>
<keys>
<key name="aws_access_key_id">AIDAJILINIFRJA2HBEEQ </key>
<key name="aws_secret_access_key"> 5syV8k5gCDJXtSCW4BKOjcpCLJHAhgbe/YfSPoJE </key>
</keys>
Ostorlabは両方のキーの存在を検出できます。

「AWS sensitive information hardcoded in the application」をクリックすると、技術的な詳細のセクションでキーを確認できます。
したがって、モバイルアプリケーションを開発していてAWSのサービスを利用している場合は、次の点に注意してください。 - アクセスキーをハードコードしていないか確認する - アクセスキーが簡単に取り出されないよう、コードを難読化する(Proguardを確認してください) - キーは別のコンポーネントに保存し、たとえばAWS Secret Managerを使って、必要なときにだけ取得する