

lambdaのコード内のシェルでmysqlコマンド等認証情報が残るコマンドを打つとログに認証情報が残ってしまいます。  
ログに認証情報が残らないようにするにはどうすればいいでしょうか？  
以下がコードの例です。

[code]

    def lambda_handler(event, context):
        try:
            # all running EC2 instances
            ec2_resp = ec2.describe_instances(Filters=[{'Name':'instance-state-name','Values':['running']}] )
    
            ec2_count = len(ec2_resp['Reservations'])
            if ec2_count == 0:
                logger.info('No EC2 is running')
    
            # Get All InstanceID
            instances = [i["InstanceId"] for r in ec2_resp["Reservations"] for i in r["Instances"]]
            ssm.send_command(
                InstanceIds = instances,
                DocumentName = "AWS-RunShellScript",
                Parameters = {
                    "commands": [
                        "mysql -u {username} --password={password} -e 'DROP DATABASE db2';
                    ],
                    "executionTimeout": ["3600"]
                },
            )
    
        except Exception as e:
            logger.error(e)
            raise e
    
[/code]


CC BY-SA 4.0
2022-11-01T08:52:13.020
91928
2022-11-01T22:30:46.693
2022-11-01T22:30:46.693
4236
39754
question
aws aws-lambda shell
lambdaのコード内のシェルでmysqlコマンド等認証情報が残るコマンドを打つとログに認証情報が残ってしまう。


LambdaだけでなくSSM
RunCommand側にもログが残りますし、EC2内にも残っているかもしれません。つまり、pythonもlambdaも関係なくshellscriptとしてコマンドラインにパスワード文字列を含める時点で問題となります。

mysql自身も[パスワードセキュリティーのためのエンドユーザーガイドライン](https://dev.mysql.com/doc/refman/5.6/ja/password-
security-user.html)として説明しています。

>   * コマンド行で -pyour_pass または --password=your_pass オプションを使用します。  
>  ...  
>  これは便利ですがセキュアではありません。
>

他の選択肢としては

>   * **mysql_config_editor ユーティリティーを使用します。** これは、.mylogin.cnf
> という名前の暗号化されたログインファイルに認証情報を格納できます。
>   * コマンド行でパスワード値を指定せずに -p または --password
> オプションを使用します。この場合、クライアントプログラムはパスワードを対話的に要求します。  
>  → 対話的ではないので、今回は使えません。
>   * **パスワードをオプションファイルに格納します。** たとえば Unix の場合、ホームディレクトリの .my.cnf ファイルの
> [client] セクションにパスワードを一覧表示することができます。
>   * MYSQL_PWD 環境変数にパスワードを保存します。  
>  この方法で MySQL パスワードを指定することは非常に危険であるため、使用するべきではありません。
>

があるようですが、セキュリティを考慮した場合、EC2内にファイル保存するぐらいしか選択肢がなさそうに見えます。

* * *

別のアプローチとして、現在、パスワードは

Lambda → SSM RunCommand → mysql

と各種機能を渡り歩くことが原因ですので、例えばSSM Parametersにパスワードを保存しておき、EC2内からaws
cliで取得することでLambda及びSSM RunCommandを経由しない方法もあります。

[code]

    mysql -u {username} --password=$(aws ssm get-parameter --name パラメーター名 --with-decryption --query Parameter.Value --output text) -e 'DROP DATABASE db2'
    
[/code]

MySQLが警告するコマンド行にパスワードが残っている問題は解決していませんが、質問のようにAWSの各種ログには残らないです。


CC BY-SA 4.0
2022-11-01T22:29:16.530
91937
2022-11-01T22:29:16.530
4236
91928
answer