Problem Shooting

Sep 14

Permissions Policy를 수정해서 권한 관리하기 SOLVED

  • Goal
    • 모든 사용자의 Get Object 허용
    • 특정 사용자의 Put Object 허용
    • 특정 사용자 외의 Put Object 거부

해결 방법

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::MY_BUCKETS_NAME/"
    },
    {
      "Effect": "Deny",
      "NotPrincipal": {
        "AWS": [
          "arn:aws:iam::NUMERICAL_IAM_NUMBER:root",
          "arn:aws:iam::NUMERICAL_IAM_NUMBER:user/USERNAME"
        ]
      },
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::MY_BUCKETS_NAME/*"
    }
  ]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  • Publicy Accessable로 설정해 기본적으로 모든 요청을 허용

  • Action: s3:GetObject에 대해서 모두 허용하는 규칙 명시

  • Action: s3:PutObject에 대해서 특정 사용자 외의 거부 규칙 명시

    • 이 때, NotPrincipal 옵션을 사용해서 PutObject Deny Policy를 적용하지 않을 사용자를 명시
    • IAM 사용자를 새로 하나 생성하고, S3 Full Access 권한을 허용해준 뒤
    • 해당 IAM 유저의 AWS_ACCESS_KEY_ID와 AWS_SECRET_ACCESS_KEY를 사용
    • IAM User Number(Numerical)와 IAM User Name을 Policy에 명시함

결과

S3 Storage에 접근하여 객체를 쓰는 서버는 Python 기반으로 작성되었기 때문에 boto3 라이브러리를 사용함

  1. .env 파일에 명시되어 있는 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY를 할당한 클라이언트 객체는 PutObject 요청 성공

  2. 그렇지 않은 객체는 PutObject 요청 거부됨

  • 즉, 모든 사용자가 S3 Storage에 업로드 된 객체(이 경우 영상)를 볼 수 있지만
  • 특정 사용자만 S3 Storage에 새로운 객체를 업로드할 수 있음
    • 이 "특정 사용자"는 적절한 키를 가지고 있는 서버가 됨
업로드 허용 테스트
import boto3

load_dotenv()

AWS_ACCESS_KEY_ID = os.getenv("AWS_ACCESS_KEY_ID")
AWS_SECRET_ACCESS_KEY = os.getenv("AWS_SECRET_ACCESS_KEY")

s3_client = boto3.client(
    's3',
    aws_access_key_id=AWS_ACCESS_KEY_ID,
    aws_secret_access_key=AWS_SECRET_ACCESS_KEY
)

# ... 중략 ...

def videoAnalyser(...):
    # ... 중략 ...
    try:
        s3_client.upload_file(outFilename, bucketname, objecetName,
            ExtraArgs={'ContentType': 'video/mp4'})
        print("Success to upload to S3 Storage")
    except Exception:
        print("Failed to upload to S3 Storage")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

Result:

[INFO]001_10.mp4 has been uploaded
start to analyse 001_10.mp4
Video has been loaded.
video Framesize 1920.0px * 1080.0px
video FPS 29.97 FPS
video Frames 593.0 frames
INFO: Created TensorFlow Lite XNNPACK delegate for CPU.
Success to upload to S3 Storage / 593.0







 
1
2
3
4
5
6
7
8
업로드 거부 테스트
import boto3

load_dotenv()

AWS_ACCESS_KEY_ID = os.getenv("AWS_ACCESS_KEY_ID")
AWS_SECRET_ACCESS_KEY = os.getenv("AWS_SECRET_ACCESS_KEY")

s3_client = boto3.client(
    's3',
    # aws_access_key_id=AWS_ACCESS_KEY_ID,
    # aws_secret_access_key=AWS_SECRET_ACCESS_KEY
)

# ... 중략 ...

def videoAnalyser(...):
    # ... 중략 ...
    try:
        s3_client.upload_file(outFilename, bucketname, objecetName,
            ExtraArgs={'ContentType': 'video/mp4'})
        print("Success to upload to S3 Storage")
    except Exception:
        print("Failed to upload to S3 Storage")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

Result:

[INFO]001_10.mp4 has been uploaded
start to analyse 001_10.mp4
Video has been loaded.
video Framesize 1920.0px * 1080.0px
video FPS 29.97 FPS
video Frames 593.0 frames
INFO: Created TensorFlow Lite XNNPACK delegate for CPU.
Failed to upload to S3 Storage / 593.0







 
1
2
3
4
5
6
7
8
Last Updated: 9/15/2023, 1:21:37 AM