20/01/18 TL. Introduction to Cloud Computing 5주차, 백준 1003, 11729
- -
오늘 한 일
Introduction to Cloud Computing 5주차 완강!
이것이 리눅스다 1, 2강
백준 문제 풀이
클라우드 모델에서 애플리케이션에 대한 책임은 공급자와 사용자의 공동 책임이므로, 각각의 보안에 대한 책임을 고려해야 한다.
ex. PaaS에서 애플리케이션을 빌드하고, 데이터를 클라우드로 이동시키는 경우 사용자는 애플리케이션, 워크로드, 데이터에 대한 보안을 책임진다.
클라우드 공급자의 경우에는 플랫폼의 보안 관리를 담당한다. 규정을 준수하고, 네트워크, 플랫폼, 클라우드 관리 측면에서 안전하게 보호된다. 런타임, 격리를 통해 플랫폼 내 고유한 공간을 확보할 수도 있다.
워크로드를 도입해 인프라를 서비스로 사용하는 경우 클라우드 공급자는 다운된 상태에서 하이퍼바이저를 관리한다. vm이나 베어 메탈을 사용하는 경우 OS, 실행하는 가상 서버, 가져온 데이터 등 모든 것을 완벽하게 제어할 수 있기 때문에 IaaS든 PaaS든 SaaS든 보안을 이해하는 것이 중요하다.
가져온 데이터에 대해 고려하고 그에 따라 계획해야 한다. 그건 클라우드로 가져오는 워크로드와 데이터의 리스크와 규칙 준수를 관리하는 책임의 일부이기 때문에 중요하다.
데이터의 종류를 구분하는 것도 중요하다. 이것이 기밀 데이터인가? 개인 정보가 담긴 공개 데이터인가 혹은 민감한 데이터인가? 이러한 모든 요소를 고려하고 데이터 보안 아키텍처가 무엇인지 안전하게 설계해야 한다.
유휴 데이터는 항상 암호하되도록 해야한다. 키를 잘 제어하면 공유 책임 모델에서 데이터를 소유해 데이터를 완벽하게 제어할 수 있다. 기밀 데이터를 가져오려는 경우 키 관리와 접근 방식에 대해 어떻게 할 수 있을지 생각해야 한다. 많은 부분들에서 암호화가 진행되는데, (데이터 저장소, 서비스, 애플리케이션...) API와 요청을 통해 진행된다.
메모리 내에서도 데이터를 보호할 수 있는 HW 기반 기술을 사용해 데이터를 보호할 수 있다. 키를 잘 제어해서 키를 잘 가져오거나 유지할 수 있게 하고, 데이터 액세스가 필요에 따라 이루어지는지 확인해야 한다.(어떤 사람이 데이터에 액세스 해야 하는 사용자인지를 정확히 파악해야 한다.)
애플리케이션에 취약점이 없는지 확인한다. 따라서 애플리케이션을 스캔해야 한다. 따라서 프로덕션 환경에 배포하기 전에 애플리케이션의 동적, 정적 검색을 수행할 수 있도록 AppSec, 애플리케이션 보안 접근 방식을 사용한다.
클라우드 네이티브 환경에선 컨테니어 이미지를 배포한다. 이미지를 배포하기 전 취약성을 검사하고 언제든지 프로덕션 환경에서 이미지를 보호하도록 정책을 설정해야 한다.
새로운 환경에 취약점이 있는 경우 시스템을 패치할 게 아니라 새 컨테이너를 시작하고 작업을 중단하라. 이 것이 클라우드 네이티브 접근 방식의 장점이다. 모든 단계에서 보안이 내장돼있기 때문이다. 그 다음 들어오는 사용자를 살펴볼 때, ID를 기반으로 확인한다.
네트워크 액세스의 관점에서 권한이 있는 사용자만 들어갈 수 있게 해야 한다. 침입자가 있을 경우 웹 애플리케이션 방화벽, 네트워크 액세스 제어 또는 분산 서비스 거부 보호를 통해 클라우드의 애플리케이션 및 데이터에 액세스하지 못하도록 설정할 수 있다.
----------------------------------------------
정책을 준수하는지 여부를 알 수 있도록 지속적인 보안 모니터링이 필요하다. 이를 통해 관리해야 하는 보안 위협에 대해 알 수 있다. 이를 준수하기 위해 접근 방식이나 도구들을 잘 구축해두어야 한다.
배포 환경을 통해 posture, , 위협에 대해 알 수 있다. 이 정보는 보안 이벤트, 감사 로그, 공급할 수 있는 네트워크 혹은 시스템의 플로우 로그가 될 수 있어서, 이 정보들로 posture, compliance, 위협에 대해 파악할 수 있다.
(여기서 말하는 posture는 직역하면 태세, compliance는 응낙인데, 이를 어떻게 해석해야할지 모르겠음)
또한, 이렇게 얻은 정보들을 이용해서 통찰력을 얻어 무언가를 실행할 지능을 필요로 한다.
취약점을 알아낼 수도 있다. 배포된 컨테이너 이미지는 취약하므로 새 컨테이너를 수정하고 다시 시작하거나, 의심스러운 IP에서 접근을 차단하는 것 처럼.
manage access -> gain insight -> protect data
일반적으로는 디자인과 코드를 짜는 애플리케이션팀이 작업을 수행하면, 보안 팀에게 보안과 관리를 넘긴다. 그러나, 보안은 추가 고려가 아니라 사전 고려되어야 하는 것이기 때문에 이렇게 되어선 안된다.
빌드하고 관리하고 애플리케이션을 런하기 위해 SecDevOps 접근 방식으로 수행해야 한다. 전체 수명에 보안을 내재(shift left)해야 한다. 보안 디자인이 필요로 할 것이다.
따라서 계획하거나 디자인할 때, 항상 물어야 한다. 어떤 종류의 데이터를 분류할 것인가? 어떤 종류의 애플리케이션을 빌드하고 있는가? 컨테이너 베이스인가? 마이그레이션(프라이빗 서버와 온프레미스에서 퍼블릭 클라우드 아키텍처로 옮기는 작업)중인 워크로드인가? 이러한 것들을 함께 고려하라.
보안 인식 애플리케이션을 가져야 한다. 예를 들어, 암호화하거나 민감한 데이터를 원한다면 데이터 저장소에 저장하기 전에 애플리케이션의 데이터를 암호화해서 저장할 수 있다.
(secure) design -> (secure) build -> manage security -> (secure) design -> ...
-------------------------------
클라우드 보안 관심사
데이터 손실, 누출. 무단 액세스. 불안전한 인터페이스와 api
identity and access management
포괄적인 보안 전략은 조직 사용자, 인터넷 및 소셜 기반 사용자, 타사 비즈니스 파트너 조직, 공급업체 등 광범위한 고객의 보안 요구 사항을 포괄해야 한다.
사용자의 3가지 유형
관리 사용자. 개발자 사용자. 애플리케이션 사용자
관리 사용자
클라우드 플랫폼 관리자•운영자•매니저
대표적으로 애플리케이션과 인스턴스를 생성하고 업데이트하고 삭제하는 일을 함. 팀 멤버가 하는 일을 알 필요도 있음.
관리 사용자 공격의 예시
데이터베이스에서 데이터 훔치기, 악성 프로그램 배포, 기존 애플리케이션 변경, 삭제
개발자 사용자
애플리케이션 개발자, 플랫폼 개발자, 애플래케이션 퍼블리셔
민감한 데이터를 읽거나, 애플리케이션을 생성•업데이트•삭제할 권한이 있다.
애플리케이션 사용자
호스팅된 클라우드 애플리케이션 사용자
cloud apps는 user를 cloud directory 혹은 social login 혹은 enterprise indentity provider 혹은 cloud identity provider를 통해 확인한다.
api 또는 고유 식별자가 api로 전달되어 애플리케이션 혹은 유저를 식별한다.
이렇게 식별한 후에 일회용 암호 혹은 인증서 혹은 토큰 혹은 위험 기반 인증과 같은 애플리케이션 사용자에 대한 추가 인증을 추가해 id 도용을 방지하는 데 사용한다.
cloud directory
클라우드에서 호스팅되는 애플리케이션이 자체 유저 저장소를 사용할 필요가 없음.
reporting
사용자의 리소스에 대한 액세스를 볼 수 있다. 어떤 사용자가 어떤 리소스에 액세스할 수 있는지, 액세스 권한이 변경된 사용자, 각 사용자가 악용하고 있는 액세스 권한 및 조건에 대한 정보를 제공한다.
감사 및 규정 준수
감사자는 조직의 보안 정책, 업계 규정 준수, 위험 정책에 대한 제어를 검증하고 편차를 보고한다.
사용자, 서비스 액세스 관리 기능
애플리케이션 및 서비스 소유자는 최소한의 사용자 상호 작용으로 공급업체 사용자 프로필을 프로비저닝 혹은 프로비저닝 해제할 수 있다. 소유자가 정의한 역할, 조직 액세스 제어를 간소화할 수 있다.
관리자, 개발자 사용자 계정
중요 정보에 대한 액세스 권한 부여하고 중요한 계정을 보호하는 데 몇가지 기법을 사용한다.(특정 문자를 사용하거나 최소 암호 길이 등)
액세스 그룹
1개 이상의 액세스 정책(계정의 사용자, 서비스 id, 액세스 그룹에 리소스에 대한 액세스 권한이 부여되는 방식)을 사용해 그룹 내 모든 엔터티에 동일한 액세스를 할당할 수 있도록 만든 사용자 및 서비스 id그룹.
각 사용자에게 개별 액세스 권한을 할당하는 것 보다 간소화된 액세스 할당 프로세스를 제공해 계저으이 정책 수를 줄일 수 있다.
------------------------------
암호화
데이터를 읽을 수 없게 뒤섞음. 암호화 알고리즘과 암호 해독 키를 사용한다.
클라우드 암호화 서비스
클라우드에 업로드 된 모든 데이터를 암호화 하거나 데이터의 마지막 부분을 암호화한다. 키는 필요할 때 고객에게 제공된다.
데이터는 저장 상태(유휴 상태. 여러 옵션이 있음.), 전송 중(전송 전에 암호화 하고 도착점을 인증한 후 도착 시 데이터를 해독), 사용 중(계산하기 위해 메모리에서 사용중인 데이터. 데이터를 해독할 필요 없이 암호화 된 텍스트에서 계산을 수행)일 때의 세 가지 상태로 보호한다.
서버 측 암호화 vs 클라이언트 측 암호화
서버 측 암호화 : 저장소가 데이터를 수신한 후, 데이터를 디스크에 저장하기 전에 발생. 암호화 키 생성 및 관리 또는 클라우드에서 관리 키 생성
클라이언트 측 암호화 : 데이터가 클라우드 저장소로 전송되기 전에 발생. 사용자가 클라우드 공그밪가 호스팅한 데이터를 해독할 수 없음.
요즘 기업은 하이브리드 클라우드를 사용한다는 걸 감안하고 설계해야 함.
멀티클라우드 암호화
데이터 액세스 관리, 통합 키 관리, 정교한 암호화 등의 암호화 서비스 제공. 확장성, 유연성을 제공하여 워크로드를 보호.
키 관리의 모범 사례
암호화된 키를 데이터와 분리해서 저장. 주요 백업을 오프사이트에 보관하고 정기적으로 감사. 주기적으로 새를 새로고침. 마스터 키와 복구 키 모두에 대해 다중 인증
-----------------------------------------
클라우드 모니터링
애플리케이션 혹은 서비스 스택 전체에서 성능을 모니터링 하는 것은 비용이 크기 때문에 제공.
성능 incidents을 진단하고 해결하는 걸 가속화할 수 있다. 모니터링 인프라 비용을 제어한다. 사전 알림으로 비정상적 상황의 영향을 완화시킨다. kubernetes 와 컨테이너 인사이트로 동적으로 마이크로 서비스를 관리한다. 애플리케이션과 인프라를 제어한다.
클라우드 기반 인프라에 대한 가시성과 제어를 제공하도록 설계되었다. 따라서 VM, 서비스, 데이터베이스, 애플리케이션을 24시간 내내 모니터링하여 실시간으로 데이터를 제공한다. 모든 클라우드 베이스 애플래케이션에 대한 사용자와 파일 접근에 대한 가시성을 제공한다. 규정 표준을 준수하기 위한 고급 보고 및 감사 기능을 제공한다. 멀티클라우드와 하이브리드 클라우드 환경 전반에서 대규모의 성능 모니터링을 통합한다.
인프라, db, 애플리케이션 성능 모니터링으로 분류한다.
인프라 모니터링 도구
크고 작은 hw 문제들과 보안 구멍을 확인해서 개발자와 관리자가 문제가 영향을 끼치기 전에 사전에 예방할 수 있도록 한다.
데이터베이스 모니터링 도구
서비스 프로세스, 쿼리, 가용성을 추적하여 db관리 시스템의 정확성과 신뢰성을 보장한다.
애플리케이션 성능 모니터링 도구(APM)
성능을 측정하여 애플리케이션 환경에서 발생하는 문제를 해결하는 데 필요한 툴을 제공한다. 사용자 환경을 개선하고 애플리케이션과 사용자 service level agreement(SLA)를 만족하며, 다운타임을 최소화하고, 전반적인 운영 비용을 감축시킨다.
클라우드 모니터링 모범 사례
-엔드 유저 환경 모니터링 솔루션을 활용해 엔드 유저의 관점에서 애플리케이션 성능을 캡쳐한다.
-프라이빗, 퍼블릭, 하이브리드 클라우드 등 인프라의 모든 측면을 하나의 통합 모니터링 플랫폼으로 이동한다.
-모니터링 도구를 사용한다.
-클라우드 모니터링 자동화를 증가시킨다.
-중단되거나 위반될 수 있는 시나리오를 시뮬레이션 한다.
-----------------------------------------
클라우드 소프트웨어 엔지니어
소프트웨어 배포 생명주기(코드 작성, 테스트, 관리)를 다룬다. 동시에 해당 애플리케이션의 프론트, 백엔드와 플랫폼과 시스템에 대해서도 다룬다.
적어도 1개 이상의 주요 클라우드 공급자의 기술, 비즈니스 지식 및 경험이 있어야 한다.
데이터 구조, 분산 시스템, OS, 알고리즘에 대한 지식과 db에 대한 경험, 파이썬, js, 자바, html, css와 같은 웹 애플리케이션 개발 언어에 대해 능숙해야 한다.
클라우드 통합 전문가
새로운 클라우드 서비스, 애플리케이션, 인프라를 조직 내부 시스템 및 기존 클라우드 서비스를 통합한다.
외부 및 내부 시스템 간 통합과 관련된 여러 솔루션 간의 영향과 절충점을 평가하고, 통합을 최적과 사용자 환경을 최적화한다. SLA를 만족하는 성능을 최적화한다.
클라우드 데이터 엔지니어
확장 가능한 데이터 파이프라인, 데이터 서비스를 설게, 개발, 배포하는 업무를 한다.
새 데이터 관리 기술과 sw 엔지니어링 툴을 기존 인프라에 통합한다. 기존 시스템을 이해하여 서로 다른 데이터 셋의 자동화된 통합을 권장한다. 데이터 과학자 혹은 연구자와 협력하여 개념 증명을 한다. 팀이 데이터 소비와 이해를 가속화할 수 있도록 모범 사례를 알린다. 새로운 엔지니어링 프로세스와 툴을 도입하여 전반적인 효율성을 개선한다. 새로운 엔지니어링 프로세스와 툴을 도입해 효율성을 개선한다.
클라우드 보안 엔지니어
조직의 시스템과 애플리케이션 데이터의 기밀성, 무결성, 가용성을 보호하는 데 필요한 시스템, 프로세스에 대한 전문 지식을 제공한다.
보안 요구사하응ㄹ 결정한다. 보안 시스템을 계획, 구현, 테스트한다. 클라우드 기반 환경의 보안을 강화할 방법을 권장한다. 클라우드 플랫폼 서비스, SW 설계 패턴, DevOps 툴과 방법론에 대한 심층적인 지식을 필요로 한다.
클라우드 DevOps
개발, 운영 팀과 협력하여 SW와 업데이트를 위한 안정적이고 신속한 릴리즈 파이프라인을 형성한다.
사용자 정의 자동화 도구를 만든다. 구성, 배포 프레임워크를 구축하고 유지 관리한다. 디자인 버그를 추적하고 개발자를 위해 디버깅 프로세스를 자동화한다. 웹 기반 애플래케이션 유지 관리 및 배포를 한다. 보안 문제를 모니터링한다. 예상 비즈니스 결과에 대한 성과를 측정한다.
클라우드 솔루션 설계자
비즈니스 요구 사항을 애플리케이션 아키텍처 및 설계로 변환한다.
클라우드 플랫폼과 서비스에 대한 심층 지식. SW 디자인 패턴에 대한 심층 지식. DeOps 툴과 방법론에 대한 지식. 네트워킹에 대한 이해. 주요 보안 개념에 대한 깊은 이해. 클라우드 개발자, 네트워킹 전문가, 보안 엔지니어, 통합 전문가, DevOps 엔지니어아 협력해 솔루션을 설계한다.
1003
내 풀이
import sys
def run():
arr = [[1, 0], [0, 1]]
for _ in range(2, 41):
arr.append([arr[-1][i] + arr[-2][i] for i in range(2)])
for _ in range(int(sys.stdin.readline())):
a, b = arr[int(sys.stdin.readline())]
print(a, b)
if __name__ == "__main__":
run()
다른 사람 풀이
import sys
T = int(input())
dp = [[1,0], [0,1]]
q = [int(sys.stdin.readline()) for _ in range(T)]
for i in range(2,max(q)+1):
dp.append([dp[i-2][0]+dp[i-1][0], dp[i-2][1]+dp[i-1][1]])
for i in q:
print(dp[i][0], dp[i][1])
나와 거의 비슷한 방식으로 풀었다. 차이점이 있다면, 이 사람은 들어올 input들을 모두 받고 나서 가장 큰 값 만큼만 계산을 했다는 점이다. 나머지는 모두 같다.
11729
내 풀이
import sys
process = []
def run():
hanoi(int(sys.stdin.readline()), 1, 2, 3)
print(len(process))
for a, b in process:
print(a, b)
def hanoi(num, start, via, dst):
if num == 1:
process.append([start, dst])
else:
hanoi(num - 1, start, dst, via) # n-1원반까지 start로 시작해서 dst를 거쳐 via로 가라. 그럼 start에 가장 큰 원반이 남을 것이다.
process.append([start, dst]) # 가장 큰 원반을 start에서 dst로 원반을 이동시켜라.
hanoi(num - 1, via, start, dst) # 나머지 원반을 via에서 시작해서 start를 거쳐 dst로 이동시켜라.
if __name__ == "__main__":
run()
이 문제를 해결할 때 밑의 글을 참고했다.
shoark7.github.io/programming/algorithm/tower-of-hanoi
문제를 작게 나누어 푼다는 발상을 못했다. 그런데, 이 글을 읽고 나니까 완전 답을 알려준 셈이였다. 문제를 작게 나눈다는 발상을 한다면 누구나 풀 수 있는 문제라는 뜻이기도 하다. 그렇게 생각하니 기분이 별로 좋지 못했다. 결국 나는 답지를 본 셈이니까. 앞으로는 생각하는 시간을 정해놓고 그 시간을 넘어가도록 생각한다면 그 때 참고하거나 하는 식으로 방향을 전환해야겠다.
다른 사람 풀이
import sys
def hanoi(level,start,goal):
myCache = {}
def innerHanoi(level,start,goal):
if (level,start,goal) in myCache:
return myCache[(level,start,goal)]
else:
if level==1:
returnStr = str(start) + " " + str(goal)
else:
goalTemp = 6-start-goal
returnStr = "\n".join(char for char in [innerHanoi(level-1,start,goalTemp),
str(start) + " " + str(goal),
innerHanoi(level-1,goalTemp,goal)])
myCache[(level,start,goal)] = returnStr
return returnStr
print(innerHanoi(level,start,goal))
N = int(sys.stdin.readline())
print(2**N-1)
hanoi(N,1,3)
나는 매번 기록을 해두고, 기록의 길이를 return 했는데, 이 사람은 하노이탑 해결하는 수가 2의 지수승 - 1임을 안 상태로 해결했다.
"\n".join(arr)은 arr의 요소들을 각각 \n으로 연결해서 반환해준다.
arr = ["Hello", "Python", "World"]
result = "-".join(arr)
print(result)
>>Hello-Python-World
인 것이다.
즉, 이것도 기본적인 틀은 나의 풀이와 같다. 또, myChache를 두어 같은 연산을 반복할 필요가 없도록 했다. 이런 테크닉은 기억해 두었다가 연산을 줄이는 데 사용할 수 있을 것이다.
'TL' 카테고리의 다른 글
01/26 TL. 기초 리눅스 명령어 (0) | 2021.01.27 |
---|---|
21/01/22 TL. (0) | 2021.01.22 |
21/01/12 TL. Introduction to Cloud Computing 4주차. 백준 10994 (0) | 2021.01.12 |
21/01/11 TL. Introduction to Cloud Computing 4주차. 백준 1065, 2941, 1316 (0) | 2021.01.11 |
21/01/10 TL. 백준 9020 (0) | 2021.01.11 |
소중한 공감 감사합니다