Security Zone 구획은 Cloud Guard의 Target이 될 수 있으며, Cloud Guard의 Detector 및 Response Recipe를 활용할 수 있습니다.
이번에 Security Zone Recipe에 다음 두 개의 새로운 Recipe가 추가되었습니다.
이제 기존 OKE 클러스터보다 더 향상된 기능을 포함하는 클러스터를 생성할 수 있습니다. 향상된 클러스터 (Enhanced Cluster)에서는 다음 기능을 수행할 수 있습니다.
기존 클러스터를 사용하고 있다면 향상된 클러스터(Enhanced Cluster)로 업그레이드를 할 수 있습니다. 업그레이드 방법은 아래 가이드를 참고합니다.
Upgrading a Basic Cluster to an Enhanced Cluster
향상된 클러스터 (Enhanced Cluster)에서는 기존 클러스터로 다운그레이드를 할 수 없습니다.
OKE Virtual Node 및 Virtual Node Pool 기능은 기존 Managed Node(컴퓨팅 인스턴스(베어 메탈 또는 가상 머신)에서 실행되며 부분적으로 사용자가 관리)와 다르게 오라클에서 완전 관리하는 Serverless 쿠버네티스 환경입니다.
향상된 클러스터(Enhanced Cluster)에서만 Virtual Node를 지원합니다.
기타 Virtual Node에 대한 제약 사항은 다음 문서의 Notable Kubernetes features and capabilities not supported when using virtual nodes 항목과 Common deployments not supported, and supported differently, when using virtual nodes 항목을 참고합니다.
이제 Kubernetes 클러스터의 기능을 지원하고 확장하는 소프트웨어 도구인 Kubernetes Cluster add-ons을 사용할 수 있습니다. 일부 클러스터 add-on(e.g, CoreDNS, kube-proxy, CNI plugin for pod networking) 은 클러스터 운영에 필수적인 반면, 일부 클러스터 add-on(e.g. Kubernetes Dashboard, Tiller, Database Operator, Weblogic Operator, Certificate Manager)은 선택 사항이 될 수 있습니다.
향상된 클러스터(Enhanced Cluster)에서만 Cluster add-ons를 지원합니다.
이제 Cluster add-ons 기능으로 다음을 수행할 수 있습니다.
향상된 클러스터(Enhanced Cluster)에서는 클러스터당 2,000개 까지 노드 확장을 지원합니다. (기존 1,000개)
이 외에도 Virtual Node의 경우 리전 별 9개까지 지원하며, 하나의 Virtual Node당 500개까지 Pod를 지원합니다. (Universal Credit 기준)
Kubneretes에서 Workload는 클러스터에서 실행되는 애플리케이션을 의미합니다. OCI의 Kubneretes 클러스터에서 실행되는 워크로드는 그 자체로 리소스로 간주되며, 이 Workload 리소스는 Cluster, Namespace, Service Account의 고유한 조합으로 식별됩니다. 이 고유의 조합을 Workload Identity라고 합니다. 이 Workload Identity를 IAM 정책에서 사용할 수 있으며, 이를 통해 Workload에서 OCI 리소스에 대한 세분화된 액세스 권한을 부여할 수 있습니다. 또한 OCI Audit을 통해서 각 Workload Identity 요청을 추적할 수 있으며, 이를 통해서 무단 액세스 및 의심스러운 활동을 모니터링 할 수 있습니다.
Workload의 모든 Pod에서 OCI 리소스에 대한 액세스 권한을 부여하려면 다음과 같은 작업이 필요합니다.
Workload Identity를 사용할 때 주의사항
1) Service Account를 위한 Namespace 생성
$ kubectl create namespace <namespace-name>
예시
$ kubectl create namespace Finance
2) Service Account 생성
$ kubectl create serviceaccount <service-account-name> \
--namespace <namespace-name>
예시
kubectl create serviceaccount FinanceServiceAccount \
--namespace Finance
3) IAM Policy 작성
Allow any-user to <verb> <resource> in <location> where all {
request.principal.type = 'workload',
request.principal.namespace = '<namespace-name>',
request.principal.service_account = '<service-account-name>',
request.principal.cluster_id = '<cluster-ocid>'}
예시
Allow any-user to manage objects in tenancy where all {
request.principal.type = 'workload',
request.principal.namespace = 'Finance',
request.principal.service_account = 'FinanceServiceAccount',
request.principal.cluster_id = 'ocid1.cluster.oc1.iad.aaaaaaaaaf______jrd'}
4) 애플리케이션의 pom.xml에 oci-java-sdk-addons-oke-workload-identity 아티팩트를 Dependency로 추가
<dependency>
<groupId>com.oracle.oci.sdk</groupId>
<artifactId>oci-java-sdk-addons-oke-workload-identity</artifactId>
<version>2.54.0</version>
</dependency>
<dependency>
<groupId>com.oracle.oci.sdk</groupId>
<artifactId>oci-java-sdk-common</artifactId>
<version>2.54.0</version>
</dependency>
5) Java 애플리케이션 코드에 다음을 추가
예시
import com.oracle.bmc.Region;
import com.oracle.bmc.auth.AuthenticationDetailsProvider;
import com.oracle.bmc.auth.ConfigFileAuthenticationDetailsProvider;
import com.oracle.bmc.auth.okeworkloadidentity.OkeWorkloadIdentityAuthenticationDetailsProvider;
import com.oracle.bmc.objectstorage.ObjectStorage;
import com.oracle.bmc.objectstorage.ObjectStorageClient;
import com.oracle.bmc.objectstorage.model.BucketSummary;
import com.oracle.bmc.objectstorage.requests.GetNamespaceRequest;
import com.oracle.bmc.objectstorage.requests.GetObjectRequest;
import com.oracle.bmc.objectstorage.requests.ListBucketsRequest;
import com.oracle.bmc.objectstorage.requests.ListBucketsRequest.Builder;
import com.oracle.bmc.objectstorage.responses.GetNamespaceResponse;
import com.oracle.bmc.objectstorage.responses.GetObjectResponse;
import com.oracle.bmc.objectstorage.responses.ListBucketsResponse;
import java.io.InputStream;
public class ObjectStorageSyncExample {
public static void main(String[] args) throws Exception {
/* Config the Container Engine for Kubernetes workload identity provider */
final OkeWorkloadIdentityAuthenticationDetailsProvider provider = new OkeWorkloadIdentityAuthenticationDetailsProvider
.OkeWorkloadIdentityAuthenticationDetailsProviderBuilder()
.build();
/* Configure the client to use workload identity provider*/
ObjectStorage client =
ObjectStorageClient.builder().region(Region.US_PHOENIX_1).build(provider);
GetNamespaceResponse namespaceResponse =
client.getNamespace(GetNamespaceRequest.builder().build());
String namespaceName = namespaceResponse.getValue();
System.out.println("Using namespace: " + namespaceName);
Builder listBucketsBuilder =
ListBucketsRequest.builder()
.namespaceName(namespaceName)
.compartmentId("enter tenancy id");
String nextToken = null;
do {
listBucketsBuilder.page(nextToken);
ListBucketsResponse listBucketsResponse =
client.listBuckets(listBucketsBuilder.build());
for (BucketSummary bucket : listBucketsResponse.getItems()) {
System.out.println("Found bucket: " + bucket.getName());
}
nextToken = listBucketsResponse.getOpcNextPage();
} while (nextToken != null);
// fetch the file from the object storage
String bucketName = null;
String objectName = null;
GetObjectResponse getResponse =
client.getObject(
GetObjectRequest.builder()
.namespaceName(namespaceName)
.bucketName(bucketName)
.objectName(objectName)
.build());
// stream contents should match the file uploaded
try (final InputStream fileStream = getResponse.getInputStream()) {
// use fileStream
} // try-with-resources automatically closes fileStream
client.close();
}
}
5) 애플리케이션의 Deployment Spec을 열고 다음을 추가
예시
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
serviceAccountName: FinanceServiceAccount
automountServiceAccountToken: true
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
6) 배포
$ kubectl create -f <filename>
예시
$ kubectl create -f financeworkloadidentity.yaml
이제 OKE Worker Node로 기존 GPU Shape외에 다음 GPU Shape을 추가 지원합니다.
OKE에서 지원되는 GPU Shape에 대한 자세한 정보는 아래 링크를 참고합니다.
https://docs.oracle.com/en-us/iaas/Content/ContEng/Tasks/contengrunninggpunodes.htm#contengrunninggpunodes_topic-supportedgpushapes
이제 Functions에서는 오라클에서 제공하는 Pre-built Function을 위한 카탈로그를 제공합니다. Pre-built Function은 사용자가 코드를 만들거나 관리할 필요 없으며, 바로 사용할 수 있습니다.
다음은 현재 제공되고 있는 Pre-built Functions 입니다.
이제 DevOps 서비스에서 Build Stage에서 사용하는 Build Runner Shape에 대해서 OCPU 수와 메모리 양(GB)을 선택하여 사용자 정의할 수 있습니다.
사용자 정의의 경우 프로비저닝 시간이 더 오래 소요됩니다.
이제 DevOps는 개인용 액세스 토큰(PAT)이 활성화되었는지 여부를 확인하기 위해 생성한 외부 코드 리포지토리에 대한 연결의 유효성을 검사합니다. 일반적으로 PAT가 삭제되었거나 만료된 경우 런타임 시 연결 실패가 발생할 수 있는데, 유효성 검사를 통해 이러한 런타임 연결 실패를 사전에 방지할 수 있습니다.
유효성 검사가 성공하였다 하더라도 PAT가 선택한 리포지토리에 액세스할 수 있는 권한이 없는 등의 이유로 빌드가 실패할 수 있습니다.
현재는 GitLab 및 Bitbucket에 대한 연결에는 유효성 검사를 지원하지 않습니다.
이 글은 개인적으로 얻은 지식과 경험을 작성한 글로 내용에 오류가 있을 수 있습니다. 또한 글 속의 의견은 개인적인 의견으로 특정 회사를 대변하지 않습니다.
Donghu Kim RELEASE-NOTES-2023-CLOUDNATIVE-SECURITY
oci-release-notes-2023 May-2023 cloudnative