Политика IAM не может запретить доступ к пользовательским маршрутам WebSocket для пользователей, подключенных к $

#amazon-web-services #aws-api-gateway #amazon-cognito #amazon-iam #aws-policies

Вопрос:

В AWS Gateway WebSocket API я пытаюсь контролировать доступ к своей конечной точке WebSocket, предоставляя некоторые права доступа некоторым пользователям, но не всем, особенно с помощью IAM, как описано в официальных документах:

https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-control-access-iam.html

В качестве теста, когда я пытаюсь Allow / Deny некоторым пользователям с определенной идентификацией, использующим определенную политику (точно такую, как показано в ссылке выше), подключиться к моей конечной точке AWS WebSocket, это работает правильно (поэтому контроль доступа к $connect работам).

Мой вариант использования-разрешить этим пользователям подключаться (вызывать $connect ), но запретить им вызывать некоторые другие пользовательские маршруты (чтобы они подключались и получали некоторые сообщения, но не могли вызывать определенные маршруты). Однако, когда я пытаюсь контролировать доступ к любому другому маршруту (как предопределенному, так $default и любому пользовательскому маршруту), подключенные пользователи все еще могут вызывать пользовательские маршруты, даже если они Deny указаны в политике.

Может быть, в документации чего-то не хватает? Почему подключенные пользователи все еще могут вызывать другие пользовательские секретные маршруты? Используемая политика в точности соответствует политике, указанной в официальных документах по ссылке выше.

И, как уже было сказано, я знаю, что политика и личность работают, потому что я могу Deny и Allow $connect маршрут, но никаких других маршрутов.

Таким образом, после подключения пользователя к WebSocket (у этого пользователя есть Allow удостоверение $connect ) пользователь также может отправить следующее сообщение (и сообщение поступает обработчику секретного маршрута), даже если секретный маршрут запрещен в политике.

Обратите внимание, invokeCommand это мой секретный маршрут.

 { "action": "invokeCommand", "command": "Secret route was invoked, but it actually should NOT!" }
 

Я совершенно не понимаю, почему этот маршрут все еще доступен.

Вот Policy то, что я использую:

 {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:eu-central-1:277312736995:gvcpcdepy1/*/$connect"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Deny",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:eu-central-1:277312736995:gvcpcdepy1/*/invokeCommand"
        }
    ]
}
 

Вот журнал доступа к API WebSocket:

 2021-05-14T09:41:44.226 02:00   (fVXSzFw4liAFdRA=) Extended Request Id: fVXSzFw4liAFdRA=
2021-05-14T09:41:44.226 02:00   (fVXSzFw4liAFdRA=) Verifying Usage Plan for request: fVXSzFw4liAFdRA=. API Key:  API Stage: gvcpcdepy1/dev
2021-05-14T09:41:44.227 02:00   (fVXSzFw4liAFdRA=) API Key  authorized because route 'invokeCommand' does not require API Key. Request will not contribute to throttle or quota limits
2021-05-14T09:41:44.227 02:00   (fVXSzFw4liAFdRA=) Usage Plan check succeeded for API Key  and API Stage gvcpcdepy1/dev
2021-05-14T09:41:44.228 02:00   (fVXSzFw4liAFdRA=) Starting execution for request: fVXSzFw4liAFdRA=
2021-05-14T09:41:44.228 02:00   (fVXSzFw4liAFdRA=) WebSocket Request Route: [invokeCommand]
2021-05-14T09:41:44.228 02:00   (fVXSzFw4liAFdRA=) WebSocket API [gvcpcdepy1] received message from client [Connection Id: fVXRcdAYliACE8A=].
2021-05-14T09:41:44.228 02:00   (fVXSzFw4liAFdRA=) WebSocket API [gvcpcdepy1] received message from client [fVXRcdAYliACE8A=]. Message: [{"requestContext":{"routeKey":"invokeCommand","messageId":"fVXSzdAuliACE8A=","eventType":"MESSAGE","extendedRequestId":"fVXSzFw4liAFdRA=","requestTime":"14/May/2021:19:41:44  0000","messageDirection":"IN","stage":"dev","connectedAt":1621021295576,"requestTimeEpoch":1621021304225,"identity":{"sourceIp":"85.127.7.191"},"requestId":"fVXSzFw4liAFdRA=","domainName":"gvcpcdepy1.execute-api.eu-central-1.amazonaws.com","connectionId":"fVXRcdAYliACE8A=","apiId":"gvcpcdepy1"},"body":"{ "action": "invokeCommand", "command": "DEVICE FIRMWARE VERSION" }","isBase64Encoded":false}].
2021-05-14T09:41:44.228 02:00   (fVXSzFw4liAFdRA=) Endpoint request URI: https://lambda.eu-central-1.amazonaws.com/2015-03-31/functions/arn:aws:lambda:eu-central-1:277312736995:function:on-controller-dev-invokeCommandHandler/invocations
2021-05-14T09:41:44.228 02:00   (fVXSzFw4liAFdRA=) Endpoint request headers: {x-amzn-lambda-integration-tag=fVXSzFw4liAFdRA=, Authorization=***************************************************************************************************************************************************************************************************************************************************************************************************************************0b7dbc, X-Amz-Date=20210514T194144Z, x-amzn-apigateway-api-id=gvcpcdepy1, X-Amz-Source-Arn=arn:aws:execute-api:eu-central-1:277312736995:gvcpcdepy1/dev/invokeCommand, Accept=application/json, User-Agent=AmazonAPIGateway_gvcpcdepy1, X-Amz-Security-Token=IQoJb3JpZ2luX2VjEGoaDGV1LWNlbnRyYWwtMSJHMEUCIEKlbtIAmHhPU4NtfPnMaH1qTmd5aPQJWGzg52NzdWwFAiEA2bgH6hS8nxIvme60u7PxI4EL6b9 k0oLM2nbQJCrjGAqwwMI8///////////ARACGgw0NzQyNDAxNDY4MDIiDHgoKWJs1yfdnEKQMiqXA5Y2zOztnyyuj2yLzZlYWoAidplaB2/NSj8yFPNKJFo4yZOPc6sLY3MSwJTOhvh2fKtoJ38JUIHYC7hXLmy2ZXwAXD9VBcpadBtdoy8npQdkeS8HZOHYpx/7XmIi Lkekmj4mkXA3qBLA4RW2vnZwxY0btpSjDGaGLI57sh zV2 [TRUNCATED]
2021-05-14T09:41:44.228 02:00   (fVXSzFw4liAFdRA=) Endpoint request body after transformations: {"requestContext":{"routeKey":"invokeCommand","messageId":"fVXSzdAuliACE8A=","eventType":"MESSAGE","extendedRequestId":"fVXSzFw4liAFdRA=","requestTime":"14/May/2021:19:41:44  0000","messageDirection":"IN","stage":"dev","connectedAt":1621021295576,"requestTimeEpoch":1621021304225,"identity":{"sourceIp":"85.127.7.191"},"requestId":"fVXSzFw4liAFdRA=","domainName":"gvcpcdepy1.execute-api.eu-central-1.amazonaws.com","connectionId":"fVXRcdAYliACE8A=","apiId":"gvcpcdepy1"},"body":"{ "action": "invokeCommand", "command": "DEVICE FIRMWARE VERSION" }","isBase64Encoded":false}
2021-05-14T09:41:44.228 02:00   (fVXSzFw4liAFdRA=) Sending request to https://lambda.eu-central-1.amazonaws.com/2015-03-31/functions/arn:aws:lambda:eu-central-1:277312736995:function:on-controller-dev-invokeCommandHandler/invocations
2021-05-14T09:41:44.392 02:00   (fVXSzFw4liAFdRA=) Received response. Status: 200, Integration latency: 164 ms
2021-05-14T09:41:44.392 02:00   (fVXSzFw4liAFdRA=) Endpoint response headers: {Date=Fri, 14 May 2021 19:41:44 GMT, Content-Type=application/json, Content-Length=44, Connection=keep-alive, x-amzn-RequestId=9edb5ae5-c7e6-4a62-8d82-a91d7e094759, x-amzn-Remapped-Content-Length=0, X-Amz-Executed-Version=$LATEST, X-Amzn-Trace-Id=root=1-609ed278-d052a897768ba5f05cb18db1;sampled=0}
2021-05-14T09:41:44.392 02:00   (fVXSzFw4liAFdRA=) Endpoint response body before transformations: {"statusCode":200,"body":"Command invoked."}
2021-05-14T09:41:44.392 02:00   (fVXSzFw4liAFdRA=) AWS Integration Endpoint RequestId : 9edb5ae5-c7e6-4a62-8d82-a91d7e094759
2021-05-14T09:41:44.393 02:00   (fVXSzFw4liAFdRA=) Message from client [Connection Id: fVXRcdAYliACE8A=] sent to API [gvcpcdepy1] with response status code [200].
 

Could any one help me to understand why is this not working or what I can do to get it working?