서버구축 (WEB,DB)

MinIO 클라이언트(MC)로 스토리지 운영 자동화 및 보안 최적화

날으는물고기 2024. 10. 9. 00:52

Minio Client는 S3 호환 오브젝트 스토리지 서버에 접근하고 관리하기 위한 도구입니다. 주로 데이터 저장, 관리, 그리고 분석 작업에 사용됩니다. 이를 통해 S3 호환 스토리지에 쉽게 접근하고 데이터를 업로드, 다운로드, 삭제 등의 작업을 할 수 있습니다.

대표적인 활용

  1. 데이터 백업 및 복구
    • Minio Client는 대량의 데이터를 S3 호환 스토리지에 백업하고, 필요 시 이를 복구하는 데 유용합니다. 예를 들어, 서버의 로그 파일이나 데이터베이스 덤프를 정기적으로 S3 호환 스토리지에 백업합니다.
  2. 데이터 아카이빙
    • 오래된 데이터를 아카이브하여 장기 보관하는 용도로 사용됩니다. 특히 규제 준수를 위해 데이터를 오랜 기간 보관해야 하는 경우 유용합니다.
  3. 데이터 분석 및 처리
    • 데이터를 S3 호환 스토리지에 저장한 후, 분석 도구나 머신러닝 워크플로우에서 이를 처리하는 경우가 많습니다. 예를 들어, 데이터 레이크(data lake)를 구축하고, 이 데이터를 분석하는 데 활용할 수 있습니다.
  4. 파일 공유 및 협업
    • 대용량 파일을 저장하고 공유할 수 있는 용도로 사용됩니다. 팀 내에서 파일을 쉽게 공유하고 협업할 수 있도록 합니다.

보안 관점 가이드

Minio Client를 이용해 S3 호환 스토리지에 접근할 때는 다음과 같은 보안 가이드와 점검 포인트를 고려해야 합니다.

  1. 인증 및 권한 관리
    • 액세스 키 및 시크릿 키 보호: 액세스 키와 시크릿 키를 안전하게 저장하고 관리해야 합니다. 이를 환경 변수나 안전한 키 관리 시스템(KMS)에서 관리하는 것이 좋습니다.
    • 최소 권한 원칙: 필요한 최소 권한만 부여하여 접근 권한을 설정합니다. 예를 들어, 읽기 전용 권한이 필요한 경우, 쓰기 권한을 부여하지 않습니다.
  2. 데이터 암호화
    • 전송 중 암호화: 데이터 전송 시 HTTPS를 사용하여 암호화된 통신을 유지합니다.
    • 저장 중 암호화: S3 호환 스토리지에 저장되는 데이터를 암호화합니다. 서버 측 암호화(Server-Side Encryption, SSE)를 사용하거나, 클라이언트 측에서 데이터를 암호화한 후 업로드할 수 있습니다.
  3. 로그 및 모니터링
    • 접근 로그: S3 호환 스토리지에 대한 접근 로그를 활성화하여 누가 언제 어떤 작업을 했는지 기록합니다.
    • 모니터링: 비정상적인 접근 시도를 탐지하고 알림을 받을 수 있는 모니터링 시스템을 운영합니다. 예를 들어, AWS CloudTrail과 같은 도구를 사용하여 S3 접근 로그를 모니터링할 수 있습니다.
  4. 정기적인 감사 및 검토
    • 정기 감사: 정기적으로 권한 설정, 접근 로그, 보안 정책 등을 감사하여 보안 상태를 점검합니다.
    • 보안 정책 검토: 보안 정책을 주기적으로 검토하고 최신 보안 표준을 반영하도록 합니다.

예시 명령어

Minio Client를 사용하여 S3 호환 스토리지에 접근하는 몇 가지 예시 명령어를 소개합니다.

  1. 스토리지 구성: mc alias set myminio https://play.min.io accesskey secretkey
  2. 파일 업로드: mc cp myfile.txt myminio/mybucket
  3. 파일 다운로드: mc cp myminio/mybucket/myfile.txt .
  4. 파일 삭제: mc rm myminio/mybucket/myfile.txt

Minio Client를 이용한 S3 접근은 데이터 백업, 아카이빙, 분석, 파일 공유 등 다양한 용도로 활용됩니다. 이를 안전하게 사용하기 위해서는 인증 및 권한 관리, 데이터 암호화, 접근 로그 및 모니터링, 정기적인 보안 감사 등의 보안 지침을 철저히 준수해야 합니다. 이러한 보안 조치를 통해 데이터의 무결성과 기밀성을 유지하고, 잠재적인 보안 위협으로부터 보호할 수 있습니다. 사용자 윈도우 PC에서 직접 mc.exe를 사용하여 S3 버킷의 라이프사이클을 관리하는 것은 보안 및 통제 측면에서 몇 가지 문제가 발생할 수 있습니다. 이를 개선하기 위한 몇 가지 효과적인 운영 방식을 제안합니다.

1. 중앙 관리 시스템 도입

중앙 스크립트 실행 서버

중앙 집중식으로 스크립트를 실행할 수 있는 전용 서버를 설정합니다. 이 서버는 접근 통제가 엄격하며, 필요한 작업은 이 서버에서만 수행하도록 합니다.

  1. 스크립트 저장소 및 버전 관리
    • Git과 같은 버전 관리 시스템을 사용하여 스크립트를 중앙에서 관리합니다. 이를 통해 스크립트 변경 이력을 추적하고, 승인된 스크립트만 실행할 수 있습니다.
  2. 중앙 스크립트 실행
    • 모든 S3 버킷 라이프사이클 관리 스크립트는 중앙 서버에서 실행됩니다. 이를 위해 사용자는 중앙 서버에 접근 요청을 하고, 요청이 승인되면 서버에서 스크립트를 실행합니다.

예시 구조

  • 중앙 서버에 접근할 수 있는 사용자는 제한되며, 모든 작업은 로그로 기록됩니다.
  • CI/CD 파이프라인을 통해 스크립트가 실행되도록 설정하여, 자동화와 기록을 동시에 관리합니다.

2. API 기반 접근 통제

자체 API 구축

자체 API를 구축하여, 사용자가 직접 mc.exe를 실행하지 않고, API를 통해 필요한 작업을 요청합니다. API는 중앙 서버에서 실행되며, 접근 통제와 로깅 기능을 갖추고 있습니다.

  1. API 엔드포인트
    • 예를 들어, /api/v1/ilm/add와 같은 엔드포인트를 통해 라이프사이클 규칙을 추가합니다.
    • API 요청 시 인증 및 인가를 통해 권한이 있는 사용자만 접근할 수 있도록 합니다.
  2. 작업 요청
    • 사용자는 API를 통해 라이프사이클 규칙 추가 요청을 하고, 중앙 서버에서 이를 처리합니다.

예시 API 요청

curl -X POST https://api.yourdomain.com/v1/ilm/add \
     -H "Authorization: Bearer your_token" \
     -H "Content-Type: application/json" \
     -d '{
           "bucket": "dev-cmc1",
           "prefix": "pub/gmc/image_module/",
           "expiry_days": 1095
         }'

3. 자동화 및 스케줄링

자동화 스크립트 및 크론 잡

정기적으로 라이프사이클 규칙을 검토하고 업데이트하는 자동화 스크립트를 작성하여 크론 잡으로 설정합니다. 이를 통해 일관되게 정책을 적용하고, 사용자 개입을 최소화합니다.

  1. 자동화 스크립트
    • 모든 라이프사이클 규칙을 정의한 스크립트를 작성하여 중앙 서버에 배포합니다.
  2. 크론 잡 설정
    • 정기적으로 실행되도록 크론 잡을 설정하여 라이프사이클 규칙을 유지하고, 필요한 경우 업데이트합니다.

4. IAM 및 액세스 정책 강화

IAM 역할 및 정책

AWS IAM 역할과 정책을 사용하여 S3 버킷에 대한 접근을 제어합니다. 특정 역할에만 라이프사이클 정책을 수정할 수 있는 권한을 부여합니다.

  1. IAM 역할 생성
    • S3 버킷 라이프사이클 관리 역할을 생성하고, 필요한 권한만 부여합니다.
  2. 정책 적용
    • 역할에 따라 접근 가능한 사용자나 시스템을 제한하고, 모든 작업을 로그로 기록합니다.

요약하면,

  • 중앙 관리 시스템 도입: 중앙 스크립트 실행 서버 또는 CI/CD 파이프라인을 통해 일관된 관리.
  • API 기반 접근 통제: 자체 API를 통해 사용자 요청을 중앙에서 처리.
  • 자동화 및 스케줄링: 정기적인 자동화 스크립트와 크론 잡으로 관리.
  • IAM 및 액세스 정책 강화: AWS IAM을 통한 접근 제어와 모니터링.

이와 같은 방식을 통해 mc.exe를 사용하는 작업을 중앙 집중식으로 통제하고, 보안과 일관성을 유지할 수 있습니다.

 

n8n을 활용하여 S3 버킷의 라이프사이클 관리를 체계적으로 운영할 수 있습니다. n8n은 다양한 워크플로우 자동화 및 통합 작업을 수행할 수 있는 오픈 소스 자동화 도구로, 이를 통해 mc.exe 명령어를 실행하고 결과를 확인하는 작업을 자동화할 수 있습니다.

1. n8n 설정 및 기본 워크플로우 구성

n8n을 설치하고 설정합니다. 이를 위해 Docker를 사용할 수 있으며, Docker를 통해 간편하게 설치할 수 있습니다.

docker run -it --rm \
  --name n8n \
  -p 5678:5678 \
  -v ~/.n8n:/home/node/.n8n \
  n8nio/n8n

n8n에서 새로운 워크플로우를 생성하고, 이를 통해 S3 버킷 라이프사이클 관리 작업을 수행하도록 구성합니다.

2. n8n에서 mc.exe 명령어 실행

Execute Command 노드를 사용하여 mc.exe 명령어를 실행합니다. 예를 들어, 3년 만료 규칙을 추가하는 명령어를 실행하도록 설정합니다.

  1. 노드 추가: 워크플로우에 Execute Command 노드를 추가합니다.
  2. 명령어 설정
    ./mc.exe ilm add s3/dev-cmc1 --prefix "pub/gmc/image_module/" --expiry-days 1095

3. 사용자 입력 및 승인 프로세스

n8n의 Webhook 노드를 사용하여 사용자로부터 입력을 받을 수 있습니다. 이를 통해 S3 버킷 이름, 만료 기간 등을 동적으로 입력받아 처리할 수 있습니다.

  1. Webhook 노드 추가: 워크플로우 시작 지점에 Webhook 노드를 추가합니다.
  2. 입력 데이터 설정: Webhook을 통해 버킷 이름, 만료 기간 등의 데이터를 입력받도록 설정합니다.

사용자 입력 후 관리자 승인을 받아야만 작업이 진행되도록 승인 프로세스를 추가할 수 있습니다.

  1. HTTP 요청 노드: 승인 요청을 관리자에게 전송하는 HTTP 요청 노드를 추가합니다.
  2. 승인 대기: 관리자 승인을 대기하는 로직을 추가하여 승인 시에만 다음 단계로 진행되도록 합니다.

4. 워크플로우 결과 확인 및 로그

n8n의 Slack 노드를 사용하여 명령어 실행 결과를 Slack 채널로 전송할 수 있습니다.

  1. Slack 노드 추가: 워크플로우의 마지막 단계에 Slack 노드를 추가합니다.
  2. 결과 전송 설정: 명령어 실행 결과를 Slack 메시지로 전송하도록 설정합니다.

예시 워크플로우 구성

  1. Webhook 노드
    • URL: /webhook/s3-lifecycle
    • Method: POST
    • 데이터: bucket, prefix, expiry_days
  2. Execute Command 노드
    • Command: ./mc.exe ilm add s3/{{$json["bucket"]}} --prefix "{{$json["prefix"]}}" --expiry-days {{$json["expiry_days"]}}
  3. Slack 노드
    • Channel: #s3-lifecycle-logs
    • Message: S3 bucket lifecycle rule added for bucket {{$json["bucket"]}} with expiry days {{$json["expiry_days"]}}

워크플로우 예시

{
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "s3-lifecycle",
        "responseMode": "lastNode",
        "responseData": "allEntries",
        "options": {
          "rawBody": true
        }
      },
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 1,
      "position": [
        250,
        300
      ]
    },
    {
      "parameters": {
        "command": "./mc.exe ilm add s3/{{ $json.bucket }} --prefix \"{{ $json.prefix }}\" --expiry-days {{ $json.expiry_days }}"
      },
      "name": "Execute Command",
      "type": "n8n-nodes-base.executeCommand",
      "typeVersion": 1,
      "position": [
        450,
        300
      ]
    },
    {
      "parameters": {
        "webhookUrl": "https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK",
        "message": "S3 bucket lifecycle rule added for bucket {{ $json.bucket }} with expiry days {{ $json.expiry_days }}",
        "channel": "#s3-lifecycle-logs"
      },
      "name": "Slack",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 1,
      "position": [
        650,
        300
      ]
    }
  ],
  "connections": {
    "Webhook": {
      "main": [
        [
          {
            "node": "Execute Command",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Execute Command": {
      "main": [
        [
          {
            "node": "Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

n8n을 활용하여 S3 버킷의 라이프사이클 관리를 체계적으로 운영할 수 있습니다. Webhook을 통해 사용자 입력을 받고, 중앙에서 명령어를 실행하며, 결과를 Slack 등으로 알림 받는 워크플로우를 통해 보안성과 효율성을 높일 수 있습니다. 이를 통해 사용자의 직접적인 명령어 실행을 최소화하고, 중앙 집중식으로 관리할 수 있습니다.

 

컨테이너나 리눅스 환경에서도 Minio Client를 사용할 수 있습니다. Windows 환경에서는 mc.exe를 사용하지만, 리눅스나 컨테이너 환경에서는 mc를 사용하게 됩니다. 아래는 컨테이너나 리눅스 환경에서 Minio Client를 설치하고 사용하는 방법입니다.

리눅스 환경에서 Minio Client 설치

  1. Minio Client 다운로드
    wget https://dl.min.io/client/mc/release/linux-amd64/mc
  1. 실행 권한 부여
    chmod +x mc
  1. 시스템 전역에서 사용하도록 이동
    sudo mv mc /usr/local/bin/

Docker 컨테이너에서 Minio Client 사용

Minio Client는 Docker 이미지를 제공하므로, Docker 컨테이너에서 쉽게 사용할 수 있습니다.

  1. Docker 이미지 실행
    docker run -it --rm --name minio-client minio/mc sh
  1. Minio Client 설정
    mc alias set myminio https://your-minio-server:9000 accesskey secretkey

리눅스나 Docker 컨테이너 환경에서 Minio Client(mc)를 사용하여 S3 버킷의 라이프사이클 정책을 추가하고 확인하는 명령어는 다음과 같습니다.

라이프사이클 정책 추가

  1. 3년 만료 정책 추가
    mc ilm add myminio/dev-cmc1 --prefix "pub/gmc/image_module/" --expiry-days 1095
  1. 2년 만료 정책 추가
    mc ilm add myminio/dev-cmc1 --prefix "pub/gmc/image_module/" --expiry-days 730
  1. 1년 만료 정책 추가
    mc ilm add myminio/dev-cmc1 --prefix "pub/gmc/image_module/" --expiry-days 365

라이프사이클 정책 확인

mc ilm ls myminio/dev-cmc1

n8n을 활용한 자동화

n8n에서 Execute Command 노드를 사용하여 위 명령어를 실행할 수 있습니다. 앞서 설명한 워크플로우에 맞게 명령어를 수정하면 됩니다.

 

예시 워크플로우 구성

  1. Webhook 노드
    • URL: /webhook/s3-lifecycle
    • Method: POST
    • 데이터: bucket, prefix, expiry_days
  2. Execute Command 노드
    • Command: mc ilm add myminio/{{$json["bucket"]}} --prefix "{{$json["prefix"]}}" --expiry-days {{$json["expiry_days"]}}
  3. Slack 노드
    • Channel: #s3-lifecycle-logs
    • Message: S3 bucket lifecycle rule added for bucket {{$json["bucket"]}} with expiry days {{$json["expiry_days"]}}

리눅스 및 Docker 환경에서도 Minio Client를 사용하여 S3 버킷의 라이프사이클 정책을 관리할 수 있습니다. n8n을 활용하여 이를 자동화하고, Webhook을 통해 사용자 입력을 받아 명령어를 실행하며, 결과를 Slack 등으로 알림 받을 수 있습니다. 이를 통해 일관성과 보안성을 높일 수 있습니다. n8n에서 mc 명령어를 직접 실행하는 대신 Minio의 API를 통해 S3 버킷 라이프사이클 정책을 관리할 수 있습니다. Minio는 S3 API와 호환되므로, AWS S3의 API를 통해 라이프사이클 정책을 설정할 수 있습니다. 이를 위해 n8n에서 HTTP Request 노드를 사용하여 API 요청을 수행할 수 있습니다.

 

다음은 n8n을 사용하여 Minio 서버에 라이프사이클 정책을 추가하는 방법입니다.

1. Minio 서버에 라이프사이클 정책 추가하기

Minio 서버에 라이프사이클 정책을 추가하려면 S3 호환 API를 사용합니다. 라이프사이클 정책을 설정하기 위해 XML 형식의 정책을 PUT 요청으로 전송해야 합니다.

2. XML 라이프사이클 정책 예시

다음은 3년 만료 정책의 XML 예시입니다.

<LifecycleConfiguration>
  <Rule>
    <ID>Delete old objects</ID>
    <Prefix>pub/gmc/image_module/</Prefix>
    <Status>Enabled</Status>
    <Expiration>
      <Days>1095</Days>
    </Expiration>
  </Rule>
</LifecycleConfiguration>

3. n8n에서 HTTP Request 노드 설정

n8n에서 HTTP Request 노드를 사용하여 위 XML 정책을 Minio 서버에 전송하는 예시 워크플로우를 구성합니다.

  1. Webhook 노드
    • URL: /webhook/s3-lifecycle
    • Method: POST
    • 데이터: bucket, prefix, expiry_days
  2. Set 노드 (XML 생성)
    • XML 데이터를 생성하는 Set 노드를 추가합니다.
  3. HTTP Request 노드 (라이프사이클 정책 추가)
    • Method: PUT
    • URL: https://your-minio-server:9000/{{ $json.bucket }}?lifecycle
    • Headers: Content-Type: application/xml
    • Body: XML 형식의 라이프사이클 정책
  4. Slack 노드
    • Channel: #s3-lifecycle-logs
    • Message: S3 bucket lifecycle rule added for bucket {{$json.bucket}} with expiry days {{$json.expiry_days}}

예시 워크플로우 구성

{
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "s3-lifecycle",
        "responseMode": "lastNode",
        "responseData": "allEntries",
        "options": {
          "rawBody": true
        }
      },
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 1,
      "position": [
        250,
        300
      ]
    },
    {
      "parameters": {
        "values": {
          "string": [
            {
              "name": "lifecyclePolicy",
              "value": "<LifecycleConfiguration>\n  <Rule>\n    <ID>Delete old objects</ID>\n    <Prefix>{{ $json.prefix }}</Prefix>\n    <Status>Enabled</Status>\n    <Expiration>\n      <Days>{{ $json.expiry_days }}</Days>\n    </Expiration>\n  </Rule>\n</LifecycleConfiguration>"
            }
          ]
        },
        "options": {}
      },
      "name": "Set XML",
      "type": "n8n-nodes-base.set",
      "typeVersion": 1,
      "position": [
        450,
        300
      ]
    },
    {
      "parameters": {
        "authentication": "basicAuth",
        "url": "https://your-minio-server:9000/{{ $json.bucket }}?lifecycle",
        "method": "PUT",
        "headerParametersUi": {
          "parameter": [
            {
              "name": "Content-Type",
              "value": "application/xml"
            }
          ]
        },
        "options": {},
        "body": "={{ $json.lifecyclePolicy }}"
      },
      "name": "Add Lifecycle Policy",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 1,
      "position": [
        650,
        300
      ]
    },
    {
      "parameters": {
        "webhookUrl": "https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK",
        "message": "S3 bucket lifecycle rule added for bucket {{ $json.bucket }} with expiry days {{ $json.expiry_days }}",
        "channel": "#s3-lifecycle-logs"
      },
      "name": "Slack",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 1,
      "position": [
        850,
        300
      ]
    }
  ],
  "connections": {
    "Webhook": {
      "main": [
        [
          {
            "node": "Set XML",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set XML": {
      "main": [
        [
          {
            "node": "Add Lifecycle Policy",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Add Lifecycle Policy": {
      "main": [
        [
          {
            "node": "Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

n8n을 사용하여 S3 호환 API를 통해 Minio 서버에 라이프사이클 정책을 추가할 수 있습니다. Webhook을 통해 사용자 입력을 받고, Set 노드를 사용하여 XML 형식의 라이프사이클 정책을 생성하며, HTTP Request 노드를 통해 Minio 서버에 정책을 전송합니다. 최종적으로 Slack 노드를 통해 결과를 알림으로 받아보는 형태로 워크플로우를 구성할 수 있습니다. 이를 통해 명령어 실행 없이 API를 통해 체계적으로 S3 버킷 라이프사이클을 관리할 수 있습니다.

728x90