카테고리 없음

[10/15] 7장)비밀값 관리/시크릿 매니저 실습

그래놀라_ 2020. 10. 15. 10:52

중요한 정보를 보호하기 위한 방법

  • 외부에 노출되면 안되는 정보에 사용자 접근 통제
    • 접근통제
      • 누구인지 식별
      • 해당 사용자가 맞는지 인증
      • 권한을 부여할지 인가
  • 접근 통제를 해놨는데 우회해서 접근하려고 할 때 암호화를 통해 접근을 막는다
    • 암호화
      • 기밀성
      • 무결성 : 권한을 가지고 있는 사람이 데이터를 변경하기 전까지는 그대로여야함
      • 가용성 : 권한 있는 사람이 정보를 요청했을 때 제공할 수 있어야 함

 

  • 대칭키
    • 암호화 키와 복호화 키가 동일
    • 비밀키, 유일키, 관용 암호화 방식
    • DES, 2DES(일정 수준이상의 보안강도를 보장하지 못 함), 3DES, AES, ARIA, SEED, 등등..
  • 비대칭키
    • 암호화 키와 복호화 키가 상이
    • 개인키, 공개키 쌍으로 구성
    • 공개키 암호화 방식

보안 강도 = 비도

암호문으로 암호화에 사용된 키를 찾아내는데 걸리는 시도 횟수

 예) 비도 128 = 2^128 만큼 시도해야 암호화에 사용된 키를 알아낼 수 있다

      자전거 열쇠, 번호 자물쇠 생각하면 쉽다 번호 개수가 많을수록 비도도 높아진다 

비도가 높으면 풀기 어려워지지만 사용자가 사용하기도 불편해지므로 적절한 강도로 설정하도록 해야함 

 

Secret Manager (시크릿 매니저)

교재 313p AWS CLI를 위한 사용자 생성을 해야함

 

#1 IAM으로 이동

프로그래밍 방식 액세스 : aws에서 제공하는 기능을 프로그램에서 직접적으로 사용할 때. 

aws의 S3, EC2 등등 서비스 들에 명명된 기능들을 API라하는데 

API를 사용할 수 있게 해당 언어를 한꺼풀 입혀놓은것 : SDK 

이걸 아무나 호출할 수 없게 사용자가 누군지 식별할 수 있도록 API 접근 권한이 있는지 없는지 증명할 수 있는 수단이 액세스 키, 비밀키 . 그래서 이 걸 가지고 접근을 하면 호출을 했을 때 AWS가 판명하여 기능을 쓸 수 있도록 하는 것

 

AWS Management Console Acess: 서비스를 제공하는 서버 내에서 로그인을 통해  

 

각각 어떤 걸 허용하고 제한해 놨는지 함 보기

태그 넘어가고 검토 후 생성

#2 secret manager으로 이동

 

비밀번호 생성 저렇게 하면 안 됨 아래 링크 참고

https://www.kisa.or.kr/public/laws/laws3_View.jsp?cPage=6&mode=view&p_No=259&b_No=259&d_No=50&ST=T&SV=

https://seed.kisa.or.kr/kisa/reference/EgovGuide.do

 

KISA 암호이용활성화 - 안내서

자료실 정보보호의 기반 암호기술 및 정책에 대한 다양한 정보전달 HOME 자료실 소개 국산 암호기술 암호모듈검증 암호 역기능 대응 자료실 알림마당 안내서 암호이용실태조사 암호알고리즘 소�

seed.kisa.or.kr

다음

 

다음 누르고 넘어가기 

각 언어들을 보면 다 getSecretValue가 있는데 이 기능을 각 언어별로 감싸놓은 것 → SDK 개념

참고) 키를 지우면 최소 7일 동안 보관된다 만일의 경우를 대비해서

 

#3 인스턴스로 이동

 

 

#4 실행 후 터미널 접속

 

       __|  __|_  )

       _|  (     /   Amazon Linux AMI

      ___|\___|___|

 

https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/

[ec2-user@ip-172-31-42-86 ~]$ rm -rf *
[ec2-user@ip-172-31-42-86 ~]$ ls
[ec2-user@ip-172-31-42-86 ~]$ git clone https://github.com/deopard/aws-exercise-a.git

Cloning into 'aws-exercise-a'...

remote: Enumerating objects: 39, done.

remote: Total 39 (delta 0), reused 0 (delta 0), pack-reused 39

Unpacking objects: 100% (39/39), done.

 

 

[ec2-user@ip-172-31-42-86 ~]$ cd aws-exercise-a/
[ec2-user@ip-172-31-42-86 aws-exercise-a]$ git checkout secrets-manager

Branch 'secrets-manager' set up to track remote branch 'secrets-manager' from 'origin'.

Switched to a new branch 'secrets-manager'

 

 

[ec2-user@ip-172-31-42-86 aws-exercise-a]$ ls

app.js  LICENSE  package.json  package-lock.json

 

 

[ec2-user@ip-172-31-42-86 aws-exercise-a]$ vi app.js

const express = require('express');

const app = express();

 

// Use this code snippet in your app.

// If you need more information about configurations or implementing the sample code, visit the AWS docs:

// https://aws.amazon.com/developers/getting-started/nodejs/

 

// Load the AWS SDK

var AWS = require('aws-sdk'),

    endpoint = "https://secretsmanager.ap-northeast-2.amazonaws.com",

    region = "ap-northeast-2",

    secretName = "production/aws-exercise",      Secrets Manager 의 보안 암호 이름 ( 나중에 실습할 때 이름 바꾸면 여기도 바꿔줘야 함)

    secret,

    binarySecretData;

 

// Create a Secrets Manager client

var client = new AWS.SecretsManager({

    endpoint: endpoint,

    region: region,

    accessKeyId: 'AKIA4AQOJ2MOOQLRDV6V',                                     // 본인의 ID를 입력  <-

    secretAccessKey: 'XBW608blVMz+q7DDEkNCl31QBSktUv7t8hnNSrNc' // 본인의 키를 입력  <- 허가된 사람인지 확인하는 (우리가 내려 받은 csv파일에

});

 

app.get('/', (req, res) => {

  client.getSecretValue({ SecretId: secretName }, function (err, data) {   ← getSecretValue에 따른 반환 값이 function의 err, data에 담긴다 function은 익명함수

    if (err) {

      if (err.code === 'ResourceNotFoundException')

        console.log("The requested secret " + secretName + " was not found");

      else if (err.code === 'InvalidRequestException')

        console.log("The request was invalid due to: " + err.message);

      else if (err.code === 'InvalidParameterException')

        console.log("The request had invalid params: " + err.message);

    }

    else {            ← err가 있는게 아니라면 파싱해서 json 데이터로 가공

      // Decrypted secret using the associated KMS CMK

      // Depending on whether the secret was a string or binary, one of these fields will be populated

      if (data.SecretString !== "") {

        secret = JSON.parse(data.SecretString);

      } else {

        binarySecretData = data.SecretBinary;

      }

    }

 

res.send(`   //  res: response 백틱(`) 사이에 있는 내용을 출력한다

        SecretsManager로 실행되는 AWS exercise의 A project입니다.<br />

        - Admin 패스워드(admin_password): ${secret.admin_password}<br /> // 우리가 만든 것 보여줌. json이기                                                                                                                때문에 secret. 으로 접근 가능

        - 비밀 값(secret_key): ${secret.secret_key} <br />

        - received data: ${ JSON.stringify(secret) }   // 서버에서 전달된 데이터를 제이슨 형태로 바꾸고 출력. 이걸 위에 처럼 secret.으로 쓰는 것이다.

    `);

 

 });

});

 

app.listen(3000, () => {

  console.log('Example app listening on port 3000!');

});

 

app.get('/health', (req, res) => {

  res.status(200).send();

});

 

app.js 내용을 이해하는게 중요하다

더불어 이런 걸 만들 수있어야..

 

[ec2-user@ip-172-31-40-251 aws-exercise-a]$ tree .

 .

├── app.js

├── LICENSE

├── package.json

└── package-lock.json

 

0 directories, 4 files

 

 

[ec2-user@ip-172-31-40-251 aws-exercise-a]$ npm install

added 64 packages from 110 contributors and audited 64 packages in 2.484s

found 0 vulnerabilities

 

 

[ec2-user@ip-172-31-40-251 aws-exercise-a]$ sudo service nginx restart

nginx 다시 구동 하고

이런식으로 나와야하는데.. 난 왜..

전에 했던게 남아 있어서 conf파일 수정해줬다

 

[ec2-user@ip-172-31-40-251 www]$ vi /opt/nginx/conf/nginx.conf

worker_processes  1;

events {

    worker_connections  1024;

}

 

http {

    server_names_hash_bucket_size 256;         # 긴 서버 네임 허용

    passenger_root /var/passenger/passenger-5.3.6;

    passenger_ruby /home/ec2-user/.rvm/gems/ruby-2.4.3/wrappers/ruby;

 

    include       mime.types;

    default_type  application/octet-stream;

 

    sendfile        on;

    #tcp_nopush     on;

 

    #keepalive_timeout  0;

    keepalive_timeout  65;

 

    #gzip  on;

    server {

        listen 80;

        server_name 13.125.54.141;

        root /var/www/aws-exercise-a/public; 여기도 바꿔야할 것 같은데 안 바꿨는데 제대로 나옴

        passenger_enabled on;

        passenger_app_type node;

 

        passenger_startup_file /home/ec2-user/aws-exercise-a/app.js;

    }

 

    server {

        listen 80;

        server_name ec2-13-125-54-141.ap-northeast-2.compute.amazonaws.com;

        root /var/www/aws-exercise-b/public;

 

        passenger_enabled on;

        passenger_app_type node;

        passenger_startup_file /var/www/aws-exercise-b/app.js;  여긴 걍 안 바꿈

    }
}

 

 

 

 

* 함수가 무슨 일을 하는지 SDK 찾아봄

 

aws secret manager getSecretValue SDK 검색

 

get이 있으니 put도 있다! 응용해보기 

지만 귀차나..

 

 

secret key 삭제하기

삭제하는 순간 바로 삭제되지는 않는다