3.3. S3 API를 사용하여 Ceph 오브젝트 게이트웨이 액세스
개발자는 Amazon S3 API를 사용하기 전에 Ceph Object Gateway 및 STS(Secure Token Service)에 대한 액세스를 구성해야 합니다.
3.3.1. 사전 요구 사항
- 실행 중인 Red Hat Ceph Storage 클러스터.
- 실행 중인 Ceph 오브젝트 게이트웨이.
- RESTful 클라이언트.
3.3.2. S3 인증
Ceph Object Gateway에 대한 요청은 인증되거나 인증되지 않을 수 있습니다. Ceph Object Gateway는 인증되지 않은 요청이 익명 사용자가 전송된다고 가정합니다. Ceph Object Gateway는 카나리아 ACL을 지원합니다.
대부분의 사용 사례의 경우 클라이언트는 Amazon SDK의 AmazonS3Client
및 Python Boto와 같은 기존 오픈 소스 라이브러리를 사용합니다. 오픈 소스 라이브러리를 사용하면 액세스 키와 시크릿 키를 전달하면 라이브러리에서 요청 헤더와 인증 서명을 빌드합니다. 그러나 요청을 작성하고 서명할 수도 있습니다.
요청을 인증하려면 Ceph Object Gateway 서버로 전송하기 전에 요청에 대한 액세스 키 및 기본 64 인코딩 해시 기반 메시지 인증 코드(HMAC)를 포함해야 합니다. Ceph Object Gateway는 S3 호환 인증 방법을 사용합니다.
예제
HTTP/1.1 PUT /buckets/bucket/object.mpeg Host: cname.domain.com Date: Mon, 2 Jan 2012 00:01:01 +0000 Content-Encoding: mpeg Content-Length: 9999999 Authorization: AWS ACCESS_KEY:HASH_OF_HEADER_AND_SECRET
위 예에서 ACCESS_KEY
를 액세스 키 ID 뒤에 콜론(:
)의 값으로 바꿉니다. HASH_OF_HEADER_AND_SECRET
을 정식화된 헤더 문자열 해시 및 액세스 키 ID에 해당하는 시크릿으로 교체합니다.
헤더 문자열 및 시크릿의 해시 생성
헤더 문자열 및 시크릿의 해시를 생성하려면 다음을 수행합니다.
- 헤더 문자열의 값을 가져옵니다.Gets the value of the header string.
- 요청 헤더 문자열을 표준 형식으로 정규화합니다.
- SHA-1 해시 알고리즘을 사용하여 HMAC를 생성합니다.
-
hmac
결과를 base-64로 인코딩합니다.
헤더 정규화
헤더를 표준 형식으로 정규화하려면 다음을 수행합니다.
-
모든
content-
헤더를 가져옵니다. -
Content-
type 및
제외한 모든 content- 헤더를 제거합니다.content-
md5 -
content-
헤더 이름이 소문자인지 확인합니다. -
사전순
으로 콘텐츠
헤더를 정렬합니다. -
날짜
헤더가 있는지 확인 및 지정된 날짜가 오프셋이 아닌 kafka를 사용하는지 확인합니다. -
x-amz-
로 시작하는 모든 헤더를 가져옵니다. -
x-amz-
헤더가 모두 소문자인지 확인합니다. -
X
-amz-
헤더를 사전순으로 정렬합니다. - 동일한 필드 이름의 여러 인스턴스를 단일 필드로 결합하고 필드 값을 쉼표로 구분합니다.
- 헤더 값의 공백과 줄 바꿈을 하나의 공백으로 바꿉니다.
- 콜론 앞과 뒤에 공백을 제거합니다.
- 각 헤더 뒤에 새 행을 추가합니다.
- 헤더를 요청 헤더에 다시 병합합니다.
HASH_OF_HEADER_AND_SECRET
을 base-64로 인코딩된 HMAC 문자열로 바꿉니다.
추가 리소스
- 자세한 내용은 Amazon Simple Storage Service 설명서의 REST 요청 서명 및 인증 섹션을 참조하십시오.
3.3.3. SSE(Server-Side Encryption)
Ceph Object Gateway는 S3 API(애플리케이션 프로그래밍 인터페이스)에 대해 업로드된 오브젝트의 서버 측 암호화를 지원합니다. 서버 측 암호화는 S3 클라이언트가 암호화되지 않은 형식으로 HTTP를 통해 데이터를 전송하며, Ceph Object Gateway는 암호화된 형식으로 해당 데이터를 Red Hat Ceph Storage 클러스터에 저장합니다.
- Red Hat은 Static Large Object(SLO) 또는 Dynamic Large Object(DLO)의 S3 개체 암호화를 지원하지 않습니다.
-
현재 SSE(Server-Side Encryption) 모드 중 어느 것도
CopyObject
에 대한 지원을 구현하지 않았습니다. 현재 개발 중입니다 [BZ#2149450].
암호화를 사용하려면 클라이언트 요청이 SSL 연결을 통해 요청을 보내야 합니다. Ceph Object Gateway에서 SSL을 사용하지 않는 한 Red Hat은 클라이언트의 S3 암호화를 지원하지 않습니다. 그러나 테스트 목적으로 관리자는 ceph config set client.rgw
명령을 사용하여 rgw_crypt_require_ssl
구성 설정을 false
로 설정한 다음 Ceph Object Gateway 인스턴스를 다시 시작하여 테스트 중에 SSL을 비활성화할 수 있습니다.
프로덕션 환경에서는 SSL을 통해 암호화된 요청을 보낼 수 없습니다. 이러한 경우 서버 측 암호화와 함께 HTTP를 사용하여 요청을 보냅니다.
서버 측 암호화를 사용하여 HTTP를 구성하는 방법에 대한 자세한 내용은 아래의 추가 리소스 섹션을 참조하십시오.
S3 Server-Side 암호화를 사용하여 S3 멀티 파트 업로드가 다중 사이트에서 올바르게 복제됩니다. 이전에는 암호 해독으로 이러한 오브젝트의 복제본이 손상되었습니다. radosgw-admin 버킷을 사용하여 암호화된 multipart --bucket-name BUCKET_NAME
명령을 사용하여 SSE를 사용하여 다중 파트 업로드를 식별할 수 있었습니다. 이 명령은 암호화된 multipart 오브젝트의 복제되지 않은 기본 복사본을 검사합니다. 각 오브젝트에 대해 식별된 오브젝트 의 Last
Cryostat 타임스탬프가 1ns
로 증가하여 피어 영역이 다시 복제되도록 합니다. SSE를 사용하는 다중 사이트 배포의 경우 모든 영역을 업그레이드한 후 모든 영역의 모든 버킷에 대해 이 명령을 실행합니다. 이렇게 하면 S3 다중 파트가 다중 사이트에서 복제를 사용하여 올바르게 업로드됩니다.
암호화 키 관리를 위한 두 가지 옵션이 있습니다.
고객 제공 키
고객 제공 키를 사용하는 경우 S3 클라이언트는 암호화된 데이터를 읽거나 쓰기 위해 각 요청과 함께 암호화 키를 전달합니다. 이러한 키를 관리하는 것은 고객의 책임입니다. 고객은 각 오브젝트를 암호화하는 데 사용된 Ceph Object Gateway의 키를 기억해야 합니다.
Ceph Object Gateway는 Amazon SSE-C 사양에 따라 S3 API에서 고객 제공 키 동작을 구현합니다.
고객은 키 관리를 처리하고 S3 클라이언트가 키를 Ceph Object Gateway에 전달하므로 Ceph Object Gateway에는 이 암호화 모드를 지원하기 위한 특별한 구성이 필요하지 않습니다.
키 관리 서비스
키 관리 서비스를 사용하는 경우 보안 키 관리 서비스는 키를 저장하고 Ceph Object Gateway는 데이터를 암호화하거나 해독하는 요청을 처리하기 위해 필요에 따라 검색합니다.
Ceph Object Gateway는 Amazon SSE-KMS 사양에 따라 S3 API에서 키 관리 서비스 동작을 구현합니다.
현재 유일하게 테스트된 키 관리 구현은 HashiCorp Vault와 OpenStack Barbican입니다. 그러나 OpenStack Barbican은 기술 프리뷰이며 프로덕션 시스템에서 사용할 수 없습니다.
3.3.4. S3 액세스 제어 목록
Ceph Object Gateway는 S3 호환 ACL(Access Control List) 기능을 지원합니다. ACL은 사용자가 버킷 또는 오브젝트에서 수행할 수 있는 작업을 지정하는 액세스 권한 부여 목록입니다. 각 권한 부여는 오브젝트에 적용되는 버킷에 적용할 때 다른 의미를 갖습니다.
권한 | bucket | 개체 |
---|---|---|
| grantee는 버킷의 오브젝트를 나열할 수 있습니다. | 권한 부여자는 오브젝트를 읽을 수 있습니다. |
| grantee는 버킷에 오브젝트를 작성하거나 삭제할 수 있습니다. | 해당 없음 |
| grantee는 버킷 ACL을 읽을 수 있습니다. | grantee는 오브젝트 ACL을 읽을 수 있습니다. |
| grantee는 버킷 ACL을 작성할 수 있습니다. | grantee는 오브젝트 ACL에 쓸 수 있습니다. |
| grantee는 버킷의 오브젝트에 대한 전체 권한을 갖습니다. | grantee는 오브젝트 ACL을 읽거나 쓸 수 있습니다. |
3.3.5. S3를 사용하여 Ceph Object Gateway에 대한 액세스 준비
게이트웨이 서버에 액세스하기 전에 Ceph Object Gateway 노드에서 몇 가지 사전 요구 사항을 따라야 합니다.
사전 요구 사항
- Ceph Object Gateway 소프트웨어 설치.
- Ceph Object Gateway 노드에 대한 루트 수준 액세스.
절차
루트
로서 방화벽에서 포트8080
을 엽니다.[root@rgw ~]# firewall-cmd --zone=public --add-port=8080/tcp --permanent [root@rgw ~]# firewall-cmd --reload
오브젝트 게이트웨이 구성 및 관리 가이드에서 언급한 대로 게이트웨이에 사용하는 DNS 서버에 와일드카드를 추가합니다.
로컬 DNS 캐싱에 대한 게이트웨이 노드를 설정할 수도 있습니다. 이렇게 하려면 다음 단계를 실행합니다.
root
로dnsmasq
를 설치하고 설정합니다.[root@rgw ~]# yum install dnsmasq [root@rgw ~]# echo "address=/.FQDN_OF_GATEWAY_NODE/IP_OF_GATEWAY_NODE" | tee --append /etc/dnsmasq.conf [root@rgw ~]# systemctl start dnsmasq [root@rgw ~]# systemctl enable dnsmasq
IP_OF_GATEWAY_NODE
및FQDN_OF_GATEWAY_NODE
를 게이트웨이 노드의 IP 주소 및 FQDN으로 바꿉니다.루트
로서 NetworkManager를 중지합니다.[root@rgw ~]# systemctl stop NetworkManager [root@rgw ~]# systemctl disable NetworkManager
루트
로서 게이트웨이 서버의 IP를 이름 서버로 설정합니다.[root@rgw ~]# echo "DNS1=IP_OF_GATEWAY_NODE" | tee --append /etc/sysconfig/network-scripts/ifcfg-eth0 [root@rgw ~]# echo "IP_OF_GATEWAY_NODE FQDN_OF_GATEWAY_NODE" | tee --append /etc/hosts [root@rgw ~]# systemctl restart network [root@rgw ~]# systemctl enable network [root@rgw ~]# systemctl restart dnsmasq
IP_OF_GATEWAY_NODE
및FQDN_OF_GATEWAY_NODE
를 게이트웨이 노드의 IP 주소 및 FQDN으로 바꿉니다.하위 도메인 요청을 확인합니다.
[user@rgw ~]$ ping mybucket.FQDN_OF_GATEWAY_NODE
FQDN_OF_GATEWAY_NODE
를 게이트웨이 노드의 FQDN으로 교체합니다.주의로컬 DNS 캐싱을 위해 게이트웨이 서버를 설정하는 것은 테스트 목적으로만 사용됩니다. 이 작업을 수행한 후에는 외부 네트워크에 액세스할 수 없습니다. Red Hat Ceph Storage 클러스터 및 게이트웨이 노드에 적절한 DNS 서버를 사용하는 것이 좋습니다.
-
Object Gateway Configuration and Administration Guide 에 언급된 대로
S3
액세스에 대한radosgw
사용자를 신중하게 만들고 생성된access_key
및secret_key
를 복사합니다. 이러한 키는S3
액세스 및 후속 버킷 관리 작업에 필요합니다.
3.3.6. Ruby AWS S3를 사용하여 Ceph Object Gateway에 액세스
S3
액세스에 대해 aws-s3
gem과 함께 Ruby 프로그래밍 언어를 사용할 수 있습니다. Ruby AWS::S3
을 사용하여 Ceph Object Gateway 서버에 액세스하는 데 사용되는 노드에서 아래에 언급된 단계를 실행합니다.
사전 요구 사항
- Ceph Object Gateway에 대한 사용자 수준 액세스.
- Ceph Object Gateway에 액세스하는 노드에 대한 루트 수준 액세스입니다.
- 인터넷 액세스.
절차
ruby
패키지를 설치합니다.[root@dev ~]# yum install ruby
참고위의 명령은
ruby
및ruby-lib
와 같은 필수 종속 항목을 설치합니다. 임의의 경우 명령은 모든 종속 항목을 설치하지 않는 경우 별도로 설치합니다.s
aws-s3
Ruby 패키지를 설치합니다.[root@dev ~]# gem install aws-s3
프로젝트 디렉터리를 생성합니다.
[user@dev ~]$ mkdir ruby_aws_s3 [user@dev ~]$ cd ruby_aws_s3
연결 파일을 생성합니다.
[user@dev ~]$ vim conn.rb
다음 내용을
conn.rb
파일에 붙여넣습니다.구문
#!/usr/bin/env ruby require 'aws/s3' require 'resolv-replace' AWS::S3::Base.establish_connection!( :server => 'FQDN_OF_GATEWAY_NODE', :port => '8080', :access_key_id => 'MY_ACCESS_KEY', :secret_access_key => 'MY_SECRET_KEY' )
FQDN_OF_GATEWAY_NODE
를 Ceph Object Gateway 노드의 FQDN으로 교체합니다.MY_ACCESS_KEY
및MY_SECRET_KEY
를 Red Hat Ceph Storage Object Gateway 구성 및 관리 가이드에 언급된S3
액세스를 위해radosgw
사용자를 생성할 때 생성된access_key
및secret_key
로 교체합니다.예제
#!/usr/bin/env ruby require 'aws/s3' require 'resolv-replace' AWS::S3::Base.establish_connection!( :server => 'testclient.englab.pnq.redhat.com', :port => '8080', :access_key_id => '98J4R9P22P5CDL65HKP8', :secret_access_key => '6C+jcaP0dp0+FZfrRNgyGA9EzRy25pURldwje049' )
파일을 저장하고 편집기를 종료합니다.
파일을 실행 가능으로 설정합니다.
[user@dev ~]$ chmod +x conn.rb
파일을 실행합니다.
[user@dev ~]$ ./conn.rb | echo $?
파일에 값을 올바르게 제공한 경우 명령의 출력은
0
이 됩니다.버킷을 만들기 위한 새 파일을 만듭니다.
[user@dev ~]$ vim create_bucket.rb
다음 내용을 파일에 붙여넣습니다.
#!/usr/bin/env ruby load 'conn.rb' AWS::S3::Bucket.create('my-new-bucket1')
파일을 저장하고 편집기를 종료합니다.
파일을 실행 가능으로 설정합니다.
[user@dev ~]$ chmod +x create_bucket.rb
파일을 실행합니다.
[user@dev ~]$ ./create_bucket.rb
명령의 출력이
true
이면 버킷my-new-bucket1
이 성공적으로 생성되었습니다.소유 버킷을 나열할 새 파일을 만듭니다.
[user@dev ~]$ vim list_owned_buckets.rb
다음 내용을 파일에 붙여넣습니다.
#!/usr/bin/env ruby load 'conn.rb' AWS::S3::Service.buckets.each do |bucket| puts "{bucket.name}\t{bucket.creation_date}" end
파일을 저장하고 편집기를 종료합니다.
파일을 실행 가능으로 설정합니다.
[user@dev ~]$ chmod +x list_owned_buckets.rb
파일을 실행합니다.
[user@dev ~]$ ./list_owned_buckets.rb
출력은 다음과 같아야 합니다.
my-new-bucket1 2020-01-21 10:33:19 UTC
오브젝트를 생성하기 위한 새 파일을 생성합니다.
[user@dev ~]$ vim create_object.rb
다음 내용을 파일에 붙여넣습니다.
#!/usr/bin/env ruby load 'conn.rb' AWS::S3::S3Object.store( 'hello.txt', 'Hello World!', 'my-new-bucket1', :content_type => 'text/plain' )
파일을 저장하고 편집기를 종료합니다.
파일을 실행 가능으로 설정합니다.
[user@dev ~]$ chmod +x create_object.rb
파일을 실행합니다.
[user@dev ~]$ ./create_object.rb
이렇게 하면
Hello World!!
문자열이 포함된hello.txt
파일이 생성됩니다.버킷의 콘텐츠를 나열할 새 파일을 만듭니다.
[user@dev ~]$ vim list_bucket_content.rb
다음 내용을 파일에 붙여넣습니다.
#!/usr/bin/env ruby load 'conn.rb' new_bucket = AWS::S3::Bucket.find('my-new-bucket1') new_bucket.each do |object| puts "{object.key}\t{object.about['content-length']}\t{object.about['last-modified']}" end
파일을 저장하고 편집기를 종료합니다.
파일을 실행 가능하게 만듭니다.
[user@dev ~]$ chmod +x list_bucket_content.rb
파일을 실행합니다.
[user@dev ~]$ ./list_bucket_content.rb
출력은 다음과 같이 표시됩니다.
hello.txt 12 Fri, 22 Jan 2020 15:54:52 GMT
빈 버킷을 삭제하기 위해 새 파일을 생성합니다.
[user@dev ~]$ vim del_empty_bucket.rb
다음 내용을 파일에 붙여넣습니다.
#!/usr/bin/env ruby load 'conn.rb' AWS::S3::Bucket.delete('my-new-bucket1')
파일을 저장하고 편집기를 종료합니다.
파일을 실행 가능으로 설정합니다.
[user@dev ~]$ chmod +x del_empty_bucket.rb
파일을 실행합니다.
[user@dev ~]$ ./del_empty_bucket.rb | echo $?
버킷이 성공적으로 삭제되면 명령은
0
을 출력으로 반환합니다.참고create_bucket.rb
파일을 편집하여 빈 버킷(예:my-new-bucket4
,my-new-bucket5
)을 생성합니다. 다음으로, 빈 버킷을 삭제하기 전에 위의del_empty_bucket.rb
파일을 편집합니다.비어 있지 않은 버킷을 삭제하기 위해 새 파일을 생성합니다.
[user@dev ~]$ vim del_non_empty_bucket.rb
다음 내용을 파일에 붙여넣습니다.
#!/usr/bin/env ruby load 'conn.rb' AWS::S3::Bucket.delete('my-new-bucket1', :force => true)
파일을 저장하고 편집기를 종료합니다.
파일을 실행 가능으로 설정합니다.
[user@dev ~]$ chmod +x del_non_empty_bucket.rb
파일을 실행합니다.
[user@dev ~]$ ./del_non_empty_bucket.rb | echo $?
버킷이 성공적으로 삭제되면 명령은
0
을 출력으로 반환합니다.오브젝트를 삭제하기 위한 새 파일을 생성합니다.
[user@dev ~]$ vim delete_object.rb
다음 내용을 파일에 붙여넣습니다.
#!/usr/bin/env ruby load 'conn.rb' AWS::S3::S3Object.delete('hello.txt', 'my-new-bucket1')
파일을 저장하고 편집기를 종료합니다.
파일을 실행 가능으로 설정합니다.
[user@dev ~]$ chmod +x delete_object.rb
파일을 실행합니다.
[user@dev ~]$ ./delete_object.rb
그러면
hello.txt
오브젝트가 삭제됩니다.
3.3.7. Ruby AWS SDK를 사용하여 Ceph Object Gateway에 액세스
S3
액세스를 위해 aws-sdk
gem과 함께 Ruby 프로그래밍 언어를 사용할 수 있습니다. Ruby AWS::SDK
를 사용하여 Ceph Object Gateway 서버에 액세스하는 데 사용되는 노드에서 아래에 언급된 단계를 실행합니다.
사전 요구 사항
- Ceph Object Gateway에 대한 사용자 수준 액세스.
- Ceph Object Gateway에 액세스하는 노드에 대한 루트 수준 액세스입니다.
- 인터넷 액세스.
절차
ruby
패키지를 설치합니다.[root@dev ~]# yum install ruby
참고위의 명령은
ruby
및ruby-lib
와 같은 필수 종속 항목을 설치합니다. 임의의 경우 명령은 모든 종속 항목을 설치하지 않는 경우 별도로 설치합니다.s
aws-sdk
Ruby 패키지를 설치합니다.[root@dev ~]# gem install aws-sdk
프로젝트 디렉터리를 생성합니다.
[user@dev ~]$ mkdir ruby_aws_sdk [user@dev ~]$ cd ruby_aws_sdk
연결 파일을 생성합니다.
[user@dev ~]$ vim conn.rb
다음 내용을
conn.rb
파일에 붙여넣습니다.구문
#!/usr/bin/env ruby require 'aws-sdk' require 'resolv-replace' Aws.config.update( endpoint: 'http://FQDN_OF_GATEWAY_NODE:8080', access_key_id: 'MY_ACCESS_KEY', secret_access_key: 'MY_SECRET_KEY', force_path_style: true, region: 'us-east-1' )
FQDN_OF_GATEWAY_NODE
를 Ceph Object Gateway 노드의 FQDN으로 교체합니다.MY_ACCESS_KEY
및MY_SECRET_KEY
를 Red Hat Ceph Storage Object Gateway 구성 및 관리 가이드에 언급된S3
액세스를 위해radosgw
사용자를 생성할 때 생성된access_key
및secret_key
로 교체합니다.예제
#!/usr/bin/env ruby require 'aws-sdk' require 'resolv-replace' Aws.config.update( endpoint: 'http://testclient.englab.pnq.redhat.com:8080', access_key_id: '98J4R9P22P5CDL65HKP8', secret_access_key: '6C+jcaP0dp0+FZfrRNgyGA9EzRy25pURldwje049', force_path_style: true, region: 'us-east-1' )
파일을 저장하고 편집기를 종료합니다.
파일을 실행 가능으로 설정합니다.
[user@dev ~]$ chmod +x conn.rb
파일을 실행합니다.
[user@dev ~]$ ./conn.rb | echo $?
파일에 값을 올바르게 제공한 경우 명령의 출력은
0
이 됩니다.버킷을 만들기 위한 새 파일을 만듭니다.
[user@dev ~]$ vim create_bucket.rb
다음 내용을 파일에 붙여넣습니다.
구문
#!/usr/bin/env ruby load 'conn.rb' s3_client = Aws::S3::Client.new s3_client.create_bucket(bucket: 'my-new-bucket2')
파일을 저장하고 편집기를 종료합니다.
파일을 실행 가능으로 설정합니다.
[user@dev ~]$ chmod +x create_bucket.rb
파일을 실행합니다.
[user@dev ~]$ ./create_bucket.rb
명령의 출력이
true
이면 버킷my-new-bucket2
가 성공적으로 생성되었습니다.소유 버킷을 나열할 새 파일을 만듭니다.
[user@dev ~]$ vim list_owned_buckets.rb
다음 내용을 파일에 붙여넣습니다.
#!/usr/bin/env ruby load 'conn.rb' s3_client = Aws::S3::Client.new s3_client.list_buckets.buckets.each do |bucket| puts "{bucket.name}\t{bucket.creation_date}" end
파일을 저장하고 편집기를 종료합니다.
파일을 실행 가능으로 설정합니다.
[user@dev ~]$ chmod +x list_owned_buckets.rb
파일을 실행합니다.
[user@dev ~]$ ./list_owned_buckets.rb
출력은 다음과 같아야 합니다.
my-new-bucket2 2020-01-21 10:33:19 UTC
오브젝트를 생성하기 위한 새 파일을 생성합니다.
[user@dev ~]$ vim create_object.rb
다음 내용을 파일에 붙여넣습니다.
#!/usr/bin/env ruby load 'conn.rb' s3_client = Aws::S3::Client.new s3_client.put_object( key: 'hello.txt', body: 'Hello World!', bucket: 'my-new-bucket2', content_type: 'text/plain' )
파일을 저장하고 편집기를 종료합니다.
파일을 실행 가능으로 설정합니다.
[user@dev ~]$ chmod +x create_object.rb
파일을 실행합니다.
[user@dev ~]$ ./create_object.rb
이렇게 하면
Hello World!!
문자열이 포함된hello.txt
파일이 생성됩니다.버킷의 콘텐츠를 나열할 새 파일을 만듭니다.
[user@dev ~]$ vim list_bucket_content.rb
다음 내용을 파일에 붙여넣습니다.
#!/usr/bin/env ruby load 'conn.rb' s3_client = Aws::S3::Client.new s3_client.list_objects(bucket: 'my-new-bucket2').contents.each do |object| puts "{object.key}\t{object.size}" end
파일을 저장하고 편집기를 종료합니다.
파일을 실행 가능하게 만듭니다.
[user@dev ~]$ chmod +x list_bucket_content.rb
파일을 실행합니다.
[user@dev ~]$ ./list_bucket_content.rb
출력은 다음과 같이 표시됩니다.
hello.txt 12 Fri, 22 Jan 2020 15:54:52 GMT
빈 버킷을 삭제하기 위해 새 파일을 생성합니다.
[user@dev ~]$ vim del_empty_bucket.rb
다음 내용을 파일에 붙여넣습니다.
#!/usr/bin/env ruby load 'conn.rb' s3_client = Aws::S3::Client.new s3_client.delete_bucket(bucket: 'my-new-bucket2')
파일을 저장하고 편집기를 종료합니다.
파일을 실행 가능으로 설정합니다.
[user@dev ~]$ chmod +x del_empty_bucket.rb
파일을 실행합니다.
[user@dev ~]$ ./del_empty_bucket.rb | echo $?
버킷이 성공적으로 삭제되면 명령은
0
을 출력으로 반환합니다.참고create_bucket.rb
파일을 편집하여 빈 버킷을 생성합니다(예:my-new-bucket6
,my-new-bucket7
). 다음으로, 빈 버킷을 삭제하기 전에 위의del_empty_bucket.rb
파일을 편집합니다.비어 있지 않은 버킷을 삭제하기 위해 새 파일을 생성합니다.
[user@dev ~]$ vim del_non_empty_bucket.rb
다음 내용을 파일에 붙여넣습니다.
#!/usr/bin/env ruby load 'conn.rb' s3_client = Aws::S3::Client.new Aws::S3::Bucket.new('my-new-bucket2', client: s3_client).clear! s3_client.delete_bucket(bucket: 'my-new-bucket2')
파일을 저장하고 편집기를 종료합니다.
파일을 실행 가능으로 설정합니다.
[user@dev ~]$ chmod +x del_non_empty_bucket.rb
파일을 실행합니다.
[user@dev ~]$ ./del_non_empty_bucket.rb | echo $?
버킷이 성공적으로 삭제되면 명령은
0
을 출력으로 반환합니다.오브젝트를 삭제하기 위한 새 파일을 생성합니다.
[user@dev ~]$ vim delete_object.rb
다음 내용을 파일에 붙여넣습니다.
#!/usr/bin/env ruby load 'conn.rb' s3_client = Aws::S3::Client.new s3_client.delete_object(key: 'hello.txt', bucket: 'my-new-bucket2')
파일을 저장하고 편집기를 종료합니다.
파일을 실행 가능으로 설정합니다.
[user@dev ~]$ chmod +x delete_object.rb
파일을 실행합니다.
[user@dev ~]$ ./delete_object.rb
그러면
hello.txt
오브젝트가 삭제됩니다.
3.3.8. PHP를 사용하여 Ceph Object Gateway에 액세스
S3 액세스에 PHP 스크립트를 사용할 수 있습니다. 이 절차에서는 버킷 또는 오브젝트 삭제와 같은 다양한 작업을 수행하는 몇 가지 PHP 스크립트 예를 제공합니다.
아래 예제는 php v5.4.16
및 aws-sdk v2.8.24
에 대해 테스트됩니다. php
>= 5.5 이상이 필요하므로 최신 버전의 aws-sdk
를 사용하지 마십시오.php
는 5.5
RHEL 7
의 기본 리포지토리에서 사용할 수 없습니다. php 5.5
를 사용하려면 epel
및 기타 타사 리포지토리를 활성화해야 합니다. 또한 php 5.5
및 최신 버전의 aws-sdk
구성 옵션은 다릅니다.
사전 요구 사항
- 개발 워크스테이션에 대한 루트 수준 액세스.
- 인터넷 액세스.
절차
php
패키지를 설치합니다.[root@dev ~]# yum install php
-
PHP용
aws-sdk
의 zip 아카이브를 다운로드하여 압축을 풉니다. 프로젝트 디렉터리를 생성합니다.
[user@dev ~]$ mkdir php_s3 [user@dev ~]$ cd php_s3
추출된
aws
디렉터리를 프로젝트 디렉터리에 복사합니다. 예를 들어 다음과 같습니다.[user@dev ~]$ cp -r ~/Downloads/aws/ ~/php_s3/
연결 파일을 생성합니다.
[user@dev ~]$ vim conn.php
conn.php
파일에 다음 내용을 붙여 넣습니다.구문
<?php define('AWS_KEY', 'MY_ACCESS_KEY'); define('AWS_SECRET_KEY', 'MY_SECRET_KEY'); define('HOST', 'FQDN_OF_GATEWAY_NODE'); define('PORT', '8080'); // require the AWS SDK for php library require '/PATH_TO_AWS/aws-autoloader.php'; use Aws\S3\S3Client; // Establish connection with host using S3 Client client = S3Client::factory(array( 'base_url' => HOST, 'port' => PORT, 'key' => AWS_KEY, 'secret' => AWS_SECRET_KEY )); ?>
FQDN_OF_GATEWAY_NODE
를 게이트웨이 노드의 FQDN으로 교체합니다.MY_ACCESS_KEY
및MY_SECRET_KEY
를 Red Hat Ceph Storage Object Gateway 구성 및 관리 가이드에 언급된S3
액세스를 위해radosgw
사용자를 생성할 때 생성된access_key
및secret_key
로 교체합니다.PATH_TO_AWS
를php
프로젝트 디렉터리에복사한
추출된 AWS 디렉터리의 절대 경로로 교체합니다.파일을 저장하고 편집기를 종료합니다.
파일을 실행합니다.
[user@dev ~]$ php -f conn.php | echo $?
파일에 값을 올바르게 제공한 경우 명령의 출력은
0
이 됩니다.버킷을 만들기 위한 새 파일을 만듭니다.
[user@dev ~]$ vim create_bucket.php
다음 내용을 새 파일에 붙여넣습니다.
구문
<?php include 'conn.php'; client->createBucket(array('Bucket' => 'my-new-bucket3')); ?>
파일을 저장하고 편집기를 종료합니다.
파일을 실행합니다.
[user@dev ~]$ php -f create_bucket.php
소유 버킷을 나열할 새 파일을 만듭니다.
[user@dev ~]$ vim list_owned_buckets.php
다음 내용을 파일에 붙여넣습니다.
구문
<?php include 'conn.php'; blist = client->listBuckets(); echo "Buckets belonging to " . blist['Owner']['ID'] . ":\n"; foreach (blist['Buckets'] as b) { echo "{b['Name']}\t{b['CreationDate']}\n"; } ?>
파일을 저장하고 편집기를 종료합니다.
파일을 실행합니다.
[user@dev ~]$ php -f list_owned_buckets.php
출력은 다음과 유사해야 합니다.
my-new-bucket3 2020-01-21 10:33:19 UTC
hello.txt
라는 소스 파일을 먼저 생성하여 오브젝트를 생성합니다.[user@dev ~]$ echo "Hello World!" > hello.txt
새 php 파일을 만듭니다.
[user@dev ~]$ vim create_object.php
다음 내용을 파일에 붙여넣습니다.
구문
<?php include 'conn.php'; key = 'hello.txt'; source_file = './hello.txt'; acl = 'private'; bucket = 'my-new-bucket3'; client->upload(bucket, key, fopen(source_file, 'r'), acl); ?>
파일을 저장하고 편집기를 종료합니다.
파일을 실행합니다.
[user@dev ~]$ php -f create_object.php
이렇게 하면
hello.txt
개체가my-new-bucket3
버킷에 생성됩니다.버킷의 콘텐츠를 나열할 새 파일을 만듭니다.
[user@dev ~]$ vim list_bucket_content.php
다음 내용을 파일에 붙여넣습니다.
구문
<?php include 'conn.php'; o_iter = client->getIterator('ListObjects', array( 'Bucket' => 'my-new-bucket3' )); foreach (o_iter as o) { echo "{o['Key']}\t{o['Size']}\t{o['LastModified']}\n"; } ?>
파일을 저장하고 편집기를 종료합니다.
파일을 실행합니다.
[user@dev ~]$ php -f list_bucket_content.php
출력은 다음과 유사합니다.
hello.txt 12 Fri, 22 Jan 2020 15:54:52 GMT
빈 버킷을 삭제하기 위해 새 파일을 생성합니다.
[user@dev ~]$ vim del_empty_bucket.php
다음 내용을 파일에 붙여넣습니다.
구문
<?php include 'conn.php'; client->deleteBucket(array('Bucket' => 'my-new-bucket3')); ?>
파일을 저장하고 편집기를 종료합니다.
파일을 실행합니다.
[user@dev ~]$ php -f del_empty_bucket.php | echo $?
버킷이 성공적으로 삭제되면 명령은
0
을 출력으로 반환합니다.참고create_bucket.php
파일을 편집하여 빈 버킷을 생성합니다(예:my-new-bucket4
,my-new-bucket5
). 다음으로 빈 버킷을 삭제하기 전에 위의del_empty_bucket_php
파일을 편집합니다.중요비어 있지 않은 버킷 삭제는 현재 PHP 2 및
aws-sdk
버전에서 지원되지 않습니다.오브젝트를 삭제하기 위한 새 파일을 생성합니다.
[user@dev ~]$ vim delete_object.php
다음 내용을 파일에 붙여넣습니다.
구문
<?php include 'conn.php'; client->deleteObject(array( 'Bucket' => 'my-new-bucket3', 'Key' => 'hello.txt', )); ?>
파일을 저장하고 편집기를 종료합니다.
파일을 실행합니다.
[user@dev ~]$ php -f delete_object.php
그러면
hello.txt
오브젝트가 삭제됩니다.
3.3.9. 보안 토큰 서비스
Amazon Web Services의 STS(Secure Token Service)는 사용자 인증을 위해 일련의 임시 보안 자격 증명을 반환합니다. Ceph Object Gateway는 STS API(애플리케이션 프로그래밍 인터페이스) 서브 세트를 구현하여 ID 및 액세스 관리(IAM)에 대한 임시 자격 증명을 제공합니다. 이러한 임시 자격 증명을 사용하면 Ceph Object Gateway의 STS 엔진을 사용하여 S3 호출을 인증합니다. STS API에 전달된 매개변수인 IAM 정책을 사용하여 임시 인증 정보를 추가로 제한할 수 있습니다.
추가 리소스
- Amazon Web Services 보안 토큰 서비스 시작 페이지.
- STS Lite 및 Keystone에 대한 자세한 내용은 Red Hat Ceph Storage 개발자 가이드 의 Keystone과 함께 STS Lite 구성 섹션을 참조하십시오.
- STS Lite 및 Keystone의 제한 사항에 대한 자세한 내용은 Red Hat Ceph Storage 개발자 가이드 의 Keystone과 함께 STS Lite 사용 제한 사항을 참조하십시오.
3.3.9.1. 보안 토큰 서비스 애플리케이션 프로그래밍 인터페이스
Ceph Object Gateway는 다음 STS(Secure Token Service) API(애플리케이션 프로그래밍 인터페이스)를 구현합니다.
AssumeRole
이 API는 교차 계정 액세스에 대한 임시 인증 정보 집합을 반환합니다. 이러한 임시 자격 증명을 사용하면 Assume Role API에 연결된 역할 및 정책에 연결된 권한 정책을 모두 사용할 수 있습니다. RoleArn
및 RoleSessionName
요청 매개변수는 필수이지만 다른 요청 매개변수는 선택 사항입니다.
RoleArn
- 설명
- Amazon Resource Name(ARN)에 길이가 20~ 2048자인 것으로 가정할 역할입니다.
- 유형
- 문자열
- 필수 항목
- 있음
RoleSessionName
- 설명
-
위임할 역할 세션 이름을 식별합니다. 역할 세션 이름은 역할을 가정할 때 다른 주체 또는 다른 이유로 세션을 고유하게 식별할 수 있습니다. 이 매개변수의 값은 2~64자 길이입니다.
=
,,
,.
,@
, and-
characters는 허용되지만 공백은 허용되지 않습니다. - 유형
- 문자열
- 필수 항목
- 있음
정책
- 설명
- 인라인 세션에서 사용할 JSON 형식의 IAM(Identity and Access Management Policy)입니다. 이 매개 변수의 값은 길이가 1에서 2048자의 값입니다.
- 유형
- 문자열
- 필수 항목
- 없음
DurationSeconds
- 설명
-
세션 기간(초)입니다. 최소 값
900
초에서 최대43200
초로 설정됩니다. 기본값은3600
초입니다. - 유형
- 정수
- 필수 항목
- 없음
ExternalId
- 설명
- 다른 계정에 대한 역할을 가정할 때 사용할 수 있는 경우 고유한 외부 식별자를 제공하십시오. 이 매개 변수의 값은 2에서 1224자의 길이입니다.
- 유형
- 문자열
- 필수 항목
- 없음
serialNumber
- 설명
- 연결된 다중 요소 인증(MFA) 장치에서 사용자의 식별 번호입니다. 매개 변수의 값은 하드웨어 장치 또는 가상 장치의 일련 번호일 수 있으며 길이가 9~256자일 수 있습니다.
- 유형
- 문자열
- 필수 항목
- 없음
TokenCode
- 설명
- 신뢰 정책에 MFA가 필요한 경우 MFA(Multi-factor authentication) 장치에서 생성된 값입니다. MFA 장치가 필요하고 이 매개변수 값이 비어 있거나 만료된 경우 AssumeRole 호출은 "액세스 거부" 오류 메시지를 반환합니다. 이 매개변수의 값은 고정 길이는 6자입니다.
- 유형
- 문자열
- 필수 항목
- 없음
AssumeRoleWithWebIdentity
이 API는 OpenID Connect 또는 OAuth 2.0 ID 공급자와 같은 애플리케이션에서 인증한 사용자의 임시 인증 정보를 반환합니다. RoleArn
및 RoleSessionName
요청 매개변수는 필수이지만 다른 요청 매개변수는 선택 사항입니다.
RoleArn
- 설명
- Amazon Resource Name(ARN)에 길이가 20~ 2048자인 것으로 가정할 역할입니다.
- 유형
- 문자열
- 필수 항목
- 있음
RoleSessionName
- 설명
-
위임할 역할 세션 이름을 식별합니다. 역할 세션 이름은 역할을 가정할 때 다른 주체 또는 다른 이유로 세션을 고유하게 식별할 수 있습니다. 이 매개변수의 값은 2~64자 길이입니다. , ,
,
.
. . . . . 문자는 허용되지만 공백은 사용할 수 없습니다. - 유형
- 문자열
- 필수 항목
- 있음
정책
- 설명
- 인라인 세션에서 사용할 JSON 형식의 IAM(Identity and Access Management Policy)입니다. 이 매개 변수의 값은 길이가 1에서 2048자의 값입니다.
- 유형
- 문자열
- 필수 항목
- 없음
DurationSeconds
- 설명
-
세션 기간(초)입니다. 최소 값
900
초에서 최대43200
초로 설정됩니다. 기본값은3600
초입니다. - 유형
- 정수
- 필수 항목
- 없음
providerID
- 설명
- ID 공급자의 도메인 이름의 정규화된 호스트 구성 요소입니다. 이 매개변수의 값은 OAuth 2.0 액세스 토큰에만 유효하며 길이가 4~2048자인 것입니다.
- 유형
- 문자열
- 필수 항목
- 없음
WebIdentityToken
- 설명
- ID 공급자에서 제공하는 OpenID Connect ID 토큰 또는 OAuth 2.0 액세스 토큰입니다. 이 매개변수의 값은 길이가 4~2048자입니다.
- 유형
- 문자열
- 필수 항목
- 없음
추가 리소스
- 자세한 내용은 Red Hat Ceph Storage 개발자 가이드 의 보안 토큰 서비스 API 섹션을 참조하십시오.
- Amazon Web Services 보안 토큰 서비스, AssumeRole 작업입니다.
- Amazon Web Services 보안 토큰 서비스, AssumeRoleWithWebIdentity 작업.
3.3.9.2. 보안 토큰 서비스 구성
rgw_sts_key
, rgw_s3_auth_use_sts
옵션을 설정하여 Ceph Object Gateway와 함께 사용하도록 Secure Token Service(STS)를 구성합니다.
S3 및 STS API는 동일한 네임스페이스에 공존하고 모두 Ceph Object Gateway의 동일한 끝점에서 액세스할 수 있습니다.
사전 요구 사항
- 실행 중인 Red Hat Ceph Storage 클러스터.
- 실행 중인 Ceph 오브젝트 게이트웨이.
- Ceph Manager 노드에 대한 루트 수준 액세스.
절차
Ceph Object Gateway 클라이언트에 다음 구성 옵션을 설정합니다.
구문
ceph config set RGW_CLIENT_NAME rgw_sts_key STS_KEY ceph config set RGW_CLIENT_NAME rgw_s3_auth_use_sts true
rgw_sts_key
는 세션 토큰을 암호화하거나 해독하는 데 사용되는 STS 키이며 정확히 16진수 문자입니다.중요STS 키는 영숫자여야 합니다.
예제
[root@mgr ~]# ceph config set client.rgw rgw_sts_key 7f8fd8dd4700mnop [root@mgr ~]# ceph config set client.rgw rgw_s3_auth_use_sts true
추가된 키를 적용하려면 Ceph Object Gateway를 다시 시작합니다.
참고NAME
열에 있는ceph orch ps
명령의 출력을 사용하여 SERVICE_TYPE.ID 정보를 가져옵니다.스토리지 클러스터의 개별 노드에서 Ceph Object Gateway를 다시 시작하려면 다음을 수행합니다.
구문
systemctl restart ceph-CLUSTER_ID@SERVICE_TYPE.ID.service
예제
[root@host01 ~]# systemctl restart ceph-c4b34c6f-8365-11ba-dc31-529020a7702d@rgw.realm.zone.host01.gwasto.service
스토리지 클러스터의 모든 노드에서 Ceph Object Gateway를 다시 시작하려면 다음을 수행합니다.
구문
ceph orch restart SERVICE_TYPE
예제
[ceph: root@host01 /]# ceph orch restart rgw
추가 리소스
- STS API에 대한 자세한 내용은 Red Hat Ceph Storage 개발자 가이드 의 Secure Token Service 애플리케이션 프로그래밍 인터페이스 섹션을 참조하십시오.
- Ceph 구성 데이터베이스 사용에 대한 자세한 내용은 Red Hat Ceph Storage 구성 가이드 의 Ceph 구성 기본 장을 참조하십시오.
3.3.9.3. OpenID Connect 공급자의 사용자 생성
Ceph Object Gateway와 OpenID Connect 공급자 간에 신뢰를 구축하기 위해 사용자 엔티티와 역할 신뢰 정책을 생성합니다.
사전 요구 사항
- Ceph Object Gateway 노드에 대한 사용자 수준 액세스.
절차
새 Ceph 사용자를 생성합니다.
구문
radosgw-admin --uid USER_NAME --display-name "DISPLAY_NAME" --access_key USER_NAME --secret SECRET user create
예제
[user@rgw ~]$ radosgw-admin --uid TESTER --display-name "TestUser" --access_key TESTER --secret test123 user create
Ceph 사용자 기능을 구성합니다.
구문
radosgw-admin caps add --uid="USER_NAME" --caps="oidc-provider=*"
예제
[user@rgw ~]$ radosgw-admin caps add --uid="TESTER" --caps="oidc-provider=*"
STS(Secure Token Service) API를 사용하여 역할 신뢰 정책에 조건을 추가합니다.
구문
"{\"Version\":\"2020-01-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"Federated\":[\"arn:aws:iam:::oidc-provider/IDP_URL\"]},\"Action\":[\"sts:AssumeRoleWithWebIdentity\"],\"Condition\":{\"StringEquals\":{\"IDP_URL:app_id\":\"AUD_FIELD\"\}\}\}\]\}"
중요위 구문 예제의
app_id
는 들어오는 토큰의AUD_FIELD
필드와 일치해야 합니다.
추가 리소스
- Amazon 웹 사이트 의 OpenID Connect ID 공급자 문서를 보려면 루트 CA Thumbprint 를 참조하십시오.
- STS API에 대한 자세한 내용은 Red Hat Ceph Storage 개발자 가이드 의 보안 토큰 서비스 애플리케이션 프로그래밍 인터페이스 섹션을 참조하십시오.
- 자세한 내용은 Red Hat Ceph Storage 개발자 가이드 의 보안 토큰 서비스 API 섹션을 참조하십시오.
3.3.9.4. OpenID Connect 공급자의 지문 가져오기
OpenID Connect 공급자(IDP) 구성 문서를 가져오려면 다음을 수행합니다.
사전 요구 사항
-
openssl
및curl
패키지를 설치합니다.
절차
IDP의 URL에서 구성 문서를 가져옵니다.
구문
curl -k -v \ -X GET \ -H "Content-Type: application/x-www-form-urlencoded" \ "IDP_URL:8000/CONTEXT/realms/REALM/.well-known/openid-configuration" \ | jq .
예제
[user@client ~]$ curl -k -v \ -X GET \ -H "Content-Type: application/x-www-form-urlencoded" \ "http://www.example.com:8000/auth/realms/quickstart/.well-known/openid-configuration" \ | jq .
IDP 인증서를 가져옵니다.
구문
curl -k -v \ -X GET \ -H "Content-Type: application/x-www-form-urlencoded" \ "IDP_URL/CONTEXT/realms/REALM/protocol/openid-connect/certs" \ | jq .
예제
[user@client ~]$ curl -k -v \ -X GET \ -H "Content-Type: application/x-www-form-urlencoded" \ "http://www.example.com/auth/realms/quickstart/protocol/openid-connect/certs" \ | jq .
-
이전 명령에서 "x5c" 응답 결과를 복사하여
certificate.crt
파일에 붙여넣습니다. 시작 부분에--BEGIN CERTIFICATE--
를 포함하고 끝에--END CERTIFICATE--
를 포함합니다. 인증서 지문을 가져옵니다.
구문
openssl x509 -in CERT_FILE -fingerprint -noout
예제
[user@client ~]$ openssl x509 -in certificate.crt -fingerprint -noout SHA1 Fingerprint=F7:D7:B3:51:5D:D0:D3:19:DD:21:9A:43:A9:EA:72:7A:D6:06:52:87
- SHA1 지문에서 모든 콜론을 제거하고 IAM 요청에서 IDP 엔터티를 생성하기 위한 입력으로 사용합니다.
추가 리소스
- Amazon 웹 사이트 의 OpenID Connect ID 공급자 문서를 보려면 루트 CA Thumbprint 를 참조하십시오.
- STS API에 대한 자세한 내용은 Red Hat Ceph Storage 개발자 가이드 의 보안 토큰 서비스 애플리케이션 프로그래밍 인터페이스 섹션을 참조하십시오.
- 자세한 내용은 Red Hat Ceph Storage 개발자 가이드 의 보안 토큰 서비스 API 섹션을 참조하십시오.
3.3.9.5. Keystone과 함께 STS Lite를 구성 및 사용 (기술 프리뷰)
Amazon STS(Secure Token Service) 및 S3 API는 동일한 네임스페이스에 공존합니다. STS 옵션은 Keystone 옵션과 함께 구성할 수 있습니다.
S3 및 STS API는 모두 Ceph Object Gateway에서 동일한 끝점을 사용하여 액세스할 수 있습니다.
사전 요구 사항
- Red Hat Ceph Storage 5.0 이상.
- 실행 중인 Ceph 오브젝트 게이트웨이.
- Boto Python 모듈, 버전 3 이상 설치.
- Ceph Manager 노드에 대한 루트 수준 액세스.
- OpenStack 노드에 대한 사용자 수준 액세스.
절차
Ceph Object Gateway 클라이언트에 다음 구성 옵션을 설정합니다.
구문
ceph config set RGW_CLIENT_NAME rgw_sts_key STS_KEY ceph config set RGW_CLIENT_NAME rgw_s3_auth_use_sts true
rgw_sts_key
는 세션 토큰을 암호화하거나 해독하는 데 사용되는 STS 키이며 정확히 16진수 문자입니다.중요STS 키는 영숫자여야 합니다.
예제
[root@mgr ~]# ceph config set client.rgw rgw_sts_key 7f8fd8dd4700mnop [root@mgr ~]# ceph config set client.rgw rgw_s3_auth_use_sts true
OpenStack 노드에서 EC2 자격 증명을 생성합니다.
예제
[user@osp ~]$ openstack ec2 credentials create +------------+--------------------------------------------------------+ | Field | Value | +------------+--------------------------------------------------------+ | access | b924dfc87d454d15896691182fdeb0ef | | links | {u'self': u'http://192.168.0.15/identity/v3/users/ | | | 40a7140e424f493d8165abc652dc731c/credentials/ | | | OS-EC2/b924dfc87d454d15896691182fdeb0ef'} | | project_id | c703801dccaf4a0aaa39bec8c481e25a | | secret | 6a2142613c504c42a94ba2b82147dc28 | | trust_id | None | | user_id | 40a7140e424f493d8165abc652dc731c | +------------+--------------------------------------------------------+
생성된 자격 증명을 사용하여 GetSessionToken API를 사용하여 임시 보안 인증 정보 집합을 다시 가져옵니다.
예제
import boto3 access_key = b924dfc87d454d15896691182fdeb0ef secret_key = 6a2142613c504c42a94ba2b82147dc28 client = boto3.client('sts', aws_access_key_id=access_key, aws_secret_access_key=secret_key, endpoint_url=https://www.example.com/rgw, region_name='', ) response = client.get_session_token( DurationSeconds=43200 )
임시 인증 정보를 얻는 데는 S3를 호출하는 데 사용할 수 있습니다.
예제
s3client = boto3.client('s3', aws_access_key_id = response['Credentials']['AccessKeyId'], aws_secret_access_key = response['Credentials']['SecretAccessKey'], aws_session_token = response['Credentials']['SessionToken'], endpoint_url=https://www.example.com/s3, region_name='') bucket = s3client.create_bucket(Bucket='my-new-shiny-bucket') response = s3client.list_buckets() for bucket in response["Buckets"]: print "{name}\t{created}".format( name = bucket['Name'], created = bucket['CreationDate'], )
새 S3Access 역할을 생성하고 정책을 구성합니다.
관리 CAPS가 있는 사용자를 할당합니다.
구문
radosgw-admin caps add --uid="USER" --caps="roles=*"
예제
[root@mgr ~]# radosgw-admin caps add --uid="gwadmin" --caps="roles=*"
S3Access 역할을 생성합니다.
구문
radosgw-admin role create --role-name=ROLE_NAME --path=PATH --assume-role-policy-doc=TRUST_POLICY_DOC
예제
[root@mgr ~]# radosgw-admin role create --role-name=S3Access --path=/application_abc/component_xyz/ --assume-role-policy-doc=\{\"Version\":\"2012-10-17\",\"Statement\":\[\{\"Effect\":\"Allow\",\"Principal\":\{\"AWS\":\[\"arn:aws:iam:::user/TESTER\"\]\},\"Action\":\[\"sts:AssumeRole\"\]\}\]\}
S3Access 역할에 권한 정책을 연결합니다.
구문
radosgw-admin role-policy put --role-name=ROLE_NAME --policy-name=POLICY_NAME --policy-doc=PERMISSION_POLICY_DOC
예제
[root@mgr ~]# radosgw-admin role-policy put --role-name=S3Access --policy-name=Policy --policy-doc=\{\"Version\":\"2012-10-17\",\"Statement\":\[\{\"Effect\":\"Allow\",\"Action\":\[\"s3:*\"\],\"Resource\":\"arn:aws:s3:::example_bucket\"\}\]\}
-
이제 다른 사용자가
gwadmin
사용자의 역할을 가정할 수 있습니다. 예를 들어gwuser
사용자는gwadmin
사용자의 권한을 가정할 수 있습니다. 가정 사용자의
access_key
및secret_key
값을 기록해 둡니다.예제
[root@mgr ~]# radosgw-admin user info --uid=gwuser | grep -A1 access_key
AssumeRole API 호출을 사용하여 assuming 사용자의
access_key
및secret_key
값을 제공합니다.예제
import boto3 access_key = 11BS02LGFB6AL6H1ADMW secret_key = vzCEkuryfn060dfee4fgQPqFrncKEIkh3ZcdOANY client = boto3.client('sts', aws_access_key_id=access_key, aws_secret_access_key=secret_key, endpoint_url=https://www.example.com/rgw, region_name='', ) response = client.assume_role( RoleArn='arn:aws:iam:::role/application_abc/component_xyz/S3Access', RoleSessionName='Bob', DurationSeconds=3600 )
중요AssumeRole API에는 S3Access 역할이 필요합니다.
추가 리소스
- Boto Python 모듈 설치에 대한 자세한 내용은 Red Hat Ceph Storage Object Gateway 가이드 의 Test S3 Access 섹션을 참조하십시오.
- 자세한 내용은 Red Hat Ceph Storage Object Gateway 가이드 의 Create a User 섹션을 참조하십시오.
3.3.9.6. Keystone에서 STS Lite를 사용하는 제한 사항 (기술 프리뷰)
Keystone의 제한 사항은 STS(Secure Token Service) 요청을 지원하지 않는다는 것입니다. 페이로드 해시는 요청에 포함되지 않습니다. 이러한 두 가지 제한 사항을 해결하려면 Boto 인증 코드를 수정해야 합니다.
사전 요구 사항
- 실행 중인 Red Hat Ceph Storage 클러스터, 버전 5.0 이상
- 실행 중인 Ceph 오브젝트 게이트웨이.
- Boto Python 모듈, 버전 3 이상 설치.
절차
Boto의
auth.py
파일을 열고 편집합니다.코드 블록에 다음 네 줄을 추가합니다.
class SigV4Auth(BaseSigner): """ Sign a request with Signature V4. """ REQUIRES_REGION = True def __init__(self, credentials, service_name, region_name): self.credentials = credentials # We initialize these value here so the unit tests can have # valid values. But these will get overriden in ``add_auth`` # later for real requests. self._region_name = region_name if service_name == 'sts': 1 self._service_name = 's3' 2 else: 3 self._service_name = service_name 4
다음 두 줄을 코드 블록에 추가합니다.
def _modify_request_before_signing(self, request): if 'Authorization' in request.headers: del request.headers['Authorization'] self._set_necessary_date_headers(request) if self.credentials.token: if 'X-Amz-Security-Token' in request.headers: del request.headers['X-Amz-Security-Token'] request.headers['X-Amz-Security-Token'] = self.credentials.token if not request.context.get('payload_signing_enabled', True): if 'X-Amz-Content-SHA256' in request.headers: del request.headers['X-Amz-Content-SHA256'] request.headers['X-Amz-Content-SHA256'] = UNSIGNED_PAYLOAD 1 else: 2 request.headers['X-Amz-Content-SHA256'] = self.payload(request)
추가 리소스
- Boto Python 모듈 설치에 대한 자세한 내용은 Red Hat Ceph Storage Object Gateway 가이드 의 Test S3 Access 섹션을 참조하십시오.