AWS PHP SDK IAM createPolicy MalformedPolicyDocument - PullRequest
0 голосов
/ 15 января 2019

У меня проблемы с созданием политики IAM в AWS PHP SDK и с ошибкой MalformedPolicyDocument.

Мне кажется, что политика JSON хороша, поэтому я не уверен, почему она нарушается.Я уверен, что это что-то простое глупое, я делаю неправильно, но просто не вижу этого.

Вариант использования здесь - это создание нового пользователя IAM, нового сегмента S3 и новой политики, которая ограничивает доступ только кзатем новая корзина присоединяет эту политику к новому пользователю.

Создается пользователь IAM и корзина S3, но как только он добирается до создания новой политики, он разрывается с ошибкой MalformedPolicyDocument.

Сохранить вимейте в виду, что этот код не предназначен для производства и предназначен только для тренировки потока и обеспечения работы основных методов, поэтому ключи здесь используются непосредственно в коде.Я подумал, что мне лучше добавить это, чтобы ответы не зависали по этому аспекту.

Вот код, который я использую для проверки рабочего процесса:

// VARIABLES
$key = 'SOMEKEY';
$secretKey = 'SOMESECRETKEY';
$domain = 'somedomain.com';
$stagingDomain = 'somestagingdomain.com';
$userName = 'somedomaincom';
$BUCKET_NAME = 'somedomaincom';
$s3Arn = 'arn:aws:s3:::' . $BUCKET_NAME;
$policyName = 'somedomaincomPolicy';
$policyArn = 'arn:aws:iam::aws:policy/' . $policyName;

require 'aws/aws-autoloader.php';
use Aws\S3\S3Client;
use Aws\Iam\IamClient;
use Aws\Exception\AwsException;

$iamClient = new IamClient([
    'version' => 'latest',
    'region' => 'us-west-2',
    'credentials' => [
        'key'    => $key,
        'secret' => $secretKey,
    ],
]);

try {
    $result = $iamClient->createUser(array(
        'UserName' => $userName,
    ));
    var_dump($result);
} catch (AwsException $e) {
    echo $e->getMessage();
    error_log($e->getMessage());
}

//Create a S3Client
$s3Client = new S3Client([
    'version' => 'latest',
    'region' => 'us-west-2',
    'credentials' => [ // CHANGE THIS TO A DIFFERENT METHOD BEFORE MOVING TO PRODUCTION
        'key'    => $key,
        'secret' => $secretKey,
    ],
]);

//Creating S3 Bucket
try {
    $result = $s3Client->createBucket([
        'Bucket' => $BUCKET_NAME,
    ]);
} catch (AwsException $e) {
    // output error message if fails
    echo $e->getMessage();
    echo "\n";
}

// SET CORS RULES
$cors = array(array(
    'AllowedOrigins' => array($domain, $stagingDomain),
    'AllowedMethods' => array('POST', 'GET', 'PUT'),
    'MaxAgeSeconds' => 3000,
    'AllowedHeaders' => array('*')
));

// ADD CORS RULES
$result = $s3Client->putBucketCors(array(
    'Bucket' => $BUCKET_NAME,
    'CORSConfiguration' => array('CORSRules' => $cors)
));

// CREATE IAM POLICY - BREAKS ON THIS, MALFORMED POLICY???
$myManagedPolicy = '{
    "Version": "latest",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "arn:aws:s3:::*"
        },
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "' . $s3Arn . '",
                "'. $s3Arn . '/*"
            ]
        }
    ]
}';

try {
    $result = $iamClient->createPolicy(array(
        'PolicyName' => $policyName,
        'PolicyDocument' => $myManagedPolicy
    ));
    var_dump($result);
} catch (AwsException $e) {
    // output error message if fails
    error_log($e->getMessage());
    echo $e->getMessage();
}

// ATTACH IAM POLICY TO USER
try {
    $attachedUserPolicies = $iamClient->getIterator('ListAttachedUserPolicies', ([
        'UserName' => $userName,
    ]));
    if (count($attachedUserPolicies) > 0) {
        foreach ($attachedUserPolicies as $attachedUserPolicy) {
            if ($attachedUserPolicy['PolicyName'] == $policyName) {
                echo $policyName . " is already attached to this role. \n";
                exit();
            }
        }
    }
    $result = $iamClient->attachUserPolicy(array(
        'UserName' => $userName,
        'PolicyArn' => $policyArn,
    ));
    var_dump($result);
} catch (AwsException $e) {
    // output error message if fails
    error_log($e->getMessage());
    echo $e->getMessage();
}

У меня естьпробовал различные способы форматирования JSON политики, такие как добавление [] к действиям и ресурсам, а также жесткое кодирование значений вместо использования переменных.

Это кажется таким простым делом, но яударил стену этим.Есть идеи, где я иду не так?

1 Ответ

0 голосов
/ 15 января 2019

Конечно, как только я опубликую это, я это выясню.

Я думаю, что моя проблема заключалась в попытке использовать "последнюю версию" в качестве версии, поэтому я изменил ее на 2012-10-17.

В случае, если это поможет кому-то другому, желающему сделать нечто подобное, вот полный рабочий код для создания нового пользователя IAM, создания ключей доступа для нового пользователя, создания нового сегмента S3, установки CORS на сегменте S3, чтобы разрешить доступ из домен и промежуточный домен, создайте новую политику, чтобы ограничить доступ только к новой корзине S3, а затем присоедините эту новую политику к новому пользователю IAM:

// VARIABLES
$key = 'YOURKEY';
$secretKey = 'YOURSECRETKEY';
$iamUserKey = '';
$iamUserSecretKey = '';
$domain = 'somedomain.com';
$stagingDomain = 'somestagingdomain.com';
$userName = 'someusername';
$BUCKET_NAME = 'somebucketname';
$s3Arn = 'arn:aws:s3:::' . $BUCKET_NAME;
$policyName = 'somepolicynamePolicy';
$policyArn = '';

require 'aws/aws-autoloader.php';
use Aws\S3\S3Client;
use Aws\Iam\IamClient;
use Aws\Exception\AwsException;

// CREATE IAM CLIENT
$iamClient = new IamClient([
    'version' => 'latest',
    'region' => 'us-west-2',
    'credentials' => [ // CHANGE THIS TO A DIFFERENT METHOD BEFORE MOVING TO PRODUCTION
        'key'    => $key,
        'secret' => $secretKey,
    ],
]);

// CREATE IAM USER
try {
    $result = $iamClient->createUser(array(
        'UserName' => $userName,
    ));
    //var_dump($result);
} catch (AwsException $e) {
    echo $e->getMessage();
    error_log($e->getMessage());
}

// CREATE IAM USER ACCESS KEYS
try {
    $result = $iamClient->createAccessKey([
        'UserName' => $userName,
    ]);
    $iamUserKey = $result['AccessKey']['AccessKeyId'];
    $iamUserSecretKey= $result['AccessKey']['SecretAccessKey'];
} catch (AwsException $e) {
    // output error message if fails
    error_log($e->getMessage());
}

// CREATE S3 CLIENT
$s3Client = new S3Client([
    'version' => 'latest',
    'region' => 'us-west-2',
    'credentials' => [ // CHANGE THIS TO A DIFFERENT METHOD BEFORE MOVING TO PRODUCTION
        'key'    => $key,
        'secret' => $secretKey,
    ],
]);

// CREATE S3 BUCKET
try {
    $result = $s3Client->createBucket([
        'Bucket' => $BUCKET_NAME,
    ]);
} catch (AwsException $e) {
    echo $e->getMessage();
    echo "\n";
}

// SET CORS RULES
$cors = array(array(
    'AllowedOrigins' => array($domain, $stagingDomain),
    'AllowedMethods' => array('POST', 'GET', 'PUT'),
    'MaxAgeSeconds' => 3000,
    'AllowedHeaders' => array('*')
));

// ADD CORS RULES
$result = $s3Client->putBucketCors(array(
    'Bucket' => $BUCKET_NAME,
    'CORSConfiguration' => array('CORSRules' => $cors)
));

// CREATE IAM POLICY - BREAKS ON THIS, MALFORMED POLICY???
$myManagedPolicy = '{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "' . $s3Arn . '"
        },
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "'. $s3Arn . '/*"
        }
    ]
}';

try {
    $result = $iamClient->createPolicy(array(
        // PolicyName is required
        'PolicyName' => $policyName,
        // PolicyDocument is required
        'PolicyDocument' => $myManagedPolicy
    ));
    //var_dump($result);
    $policyArn = $result['Policy']['Arn'];
} catch (AwsException $e) {
    // output error message if fails
    error_log($e->getMessage());
    echo $e->getMessage();
}

// ATTACH IAM POLICY TO USER
try {
    $attachedUserPolicies = $iamClient->getIterator('ListAttachedUserPolicies', ([
        'UserName' => $userName,
    ]));
    if (count($attachedUserPolicies) > 0) {
        foreach ($attachedUserPolicies as $attachedUserPolicy) {
            if ($attachedUserPolicy['PolicyName'] == $policyName) {
                echo $policyName . " is already attached to this role. \n";
                exit();
            }
        }
    }
    $result = $iamClient->attachUserPolicy(array(
        // UserName is required
        'UserName' => $userName,
        // PolicyArn is required
        'PolicyArn' => $policyArn,
    ));
    //var_dump($result);
} catch (AwsException $e) {
    // output error message if fails
    error_log($e->getMessage());
    echo $e->getMessage();
}

Не используйте этот код как есть, вы не должны добавлять свои ключи доступа непосредственно в код, как я делал в этом тестовом примере. Вам следует рассмотреть различные способы аутентификации в SDK и использовать метод, который лучше всего подходит для вашей ситуации.

...