블록 스토리지와 오브젝트 스토리지에 앞서 정형 데이터와 비정형 데이터에 대해 먼저 간략하게 설명하겠습니다.

비정형 데이터란?

일정한 규격이나 형태를 지닌 숫자 데이터와 달리 그림이나 영상, 문서와 같이 형태와 구조가 각기 다른 구조화 되지 않은 데이터

정형 데이터란?

텍스트와 같이 일정한 규격과 형태를 가진 데이터 형식

블록 스토리지

블록 스토리지는 실제 컴퓨터에 추가 하드 디스크를 꼽아서 사용하는 개념과 유사합니다.

상세개념

클라우드 컴퓨트 서비스에서 할당 받은 인스턴스가 있다고 가정해봅니다. 인스턴스는 실제 물리 컴퓨터를 여러 대 사용할 수 있도록 가상화 시켜 놓은 컴퓨터이므로 실 컴퓨터처럼 하드 디스크를 추가할 수 있습니다. 클라우드 컴퓨팅에서 컴퓨터나 서버를 인스턴스라고 부르는 것처럼, 인스턴스에 추가하는 하드 디스크를 블록 스토리지(Block Storage)라고 부릅니다.

  • Block Storage는 일반적으로 파일 시스템이 디렉토리 구조로 파일을 계층화 하여 저장
  • 데이터를 파일 규칙에 따라 관리하고, 특정 영역과 구간을 나눠 데이터를 블록 단위로 관리 하는 스토리지

 


오브젝트 스토리지

오브젝트 스토리지는 클라우드 데이터 저장 공간으로서 우리의 일상뒤에 가려져 있는 많은 클라우드 서비스와 연관되어 사용하고 있습니다.

상세개념

오브젝트 스토리지는(Object Storage)는 블록 스토리지와는 다르게 단독으로 구성될 수 있으며사용자 계정의 컨테이너에 파일이나 데이터를 저장할 수 있는 저장 공간입니다오브젝트 스토리지는 사용자 계정이 있으며해당 사용자는 스토리지를 이용하기 위하여 시스템에 로그인을 하고파일을 저장할 수 있는 디렉터리라고 하는 컨테이너를 생성 및 삭제할 수 있으며해당 컨테이너에 데이터나 음악동영상문서와 같은 파일을 업로드하고 다운로드 받을 수 있습니다또한데이터가 필요 없을 경우에는 삭제도 가능합니다.

  • 비정형 데이터를 안정하게 저장하고 관리하기 위해 등장
  • 오브젝트 스토리지는 파일에 대한 구체적인 정보를 포함한 메타데이터를 자동으로 생성, 보관, 관리 하는 방식으로 데이터를 저장
  • 데이터의 물리적인 위치는 상관 없이 사용자나 서버에서 식별할 수 있는 ID를 오브젝트에 부여하여 관리하는 스토리지
  • 데이터와 식별 가능한 ID, 메타데이터를 하나의 오브젝트로 묶고 이것을 컨테이너에 저장하고 동일한 레벨로 관리 하는 방식을 취함
  • 이런 관리 방법을 통해 파일을 저장할 때, 해당 파일과 메타데이터를 생성하여 함께 관리 하는 방식을 가짐
  • 이런 관리 방법에 따라 비정형 데이터에 정형성을 부여함으로서 훨씬 많은 양의 콘텐츠를 보다 효율적이고 지능적인 방식으로 저장 관리 할 수 있도록 함
  • 이런 관리 방식을 통해 비정형 데이터라도 메타데이터를 이용해 신속한 파일 검색 및 분석으로 또 다른 가치를 얻거나 링크 주소를 통한 파일 공유 등 비정형 데이터에 대한 접근 지원
  • 단점으로는 Throughput의 문제가 있음
    • 하나의 파일을 업데이트 할 때마다 모든 복제본이 업데이트 될 때까지 기다려야 하기 때문에 데이터를 자주 바꿔야 하는 업무에는 권장하지 않음
  • 백업, 아카이빙 비디오 파일, 가상머신 이미지 파일 등의 데이터를 저장하는데 적합
  • 오브젝트 스토리지는 발레파킹과 같다고 생각하면 됨
    • 발레 파킹의 경우 음식점에 들어가기 전 발레파킹 서비스를 받기 위해 키를 맡기게 되면 주차요원이 알아서 주차를 해주고, 음식을 다 먹고 나왔을 때, 번호표를 전달해 주면 차를 다시 앞으로 가져 오는 것처럼 차의 주차 위치가 어디인지를 알아볼 필요가 없는 것 처럼 파일이 어디에 저장되어 있는지 사용자는 알필요가 없으며, ID를 기반으로 해당 파일에 접근만 하면 되는 구조라고 생각하면 됨


'서버' 카테고리의 다른 글

Mesos  (0) 2017.01.28
OpenStack Swift  (0) 2017.01.26
블록 스토리지와 오브젝트 스토리지  (0) 2017.01.23
[Linux] sudo 명령어 실행시 PATH 연결이 안될 때 해결 방법  (0) 2017.01.17
[Linux] chmod, chown, umask  (0) 2017.01.13
[Linux] 나만의 DNS(Local DNS) 등록  (0) 2017.01.09

우분투에서 어떤 프로그램을 어느 경로에서든지 실행시키기 위해서는 아래와 같이 PATH를 추가합니다.

$ export PATH=$PATH:{명령어경로}    //명령어 경로에 해당 프로그램이 있는 경로를 넣습니다. 

그런데 만약 이 프로그램이 sudo 이용해야만 정상 실행된다면 위에서 PATH를 등록해도 되지 않습니다. 왜냐하면 우분투에서 sudo 명령어를 했을 때 현재 유저의 PATH  환경을 가져오지 않도록 기본 설정되어 있기 때문입니다.


아래와 같이 sudo 상태에서 env를 출력해서 해당 프로그램이 PATH에 있는지 확인합니다. 아래에서 보시면 PATH는 기존 계정의 PATH와는 다름을 알수 있습니다. PATH 뿐만 아니라 다른 환경변수도 조금 다를 수 있습니다. 이 PATH는 /etc/visudoers 에서 지정된 secure_path를 가져온 것입니다.

$ sudo env
LC_PAPER=ko_KR.UTF-8
LC_ADDRESS=ko_KR.UTF-8
LC_MONETARY=ko_KR.UTF-8
TERM=xterm
LC_NUMERIC=ko_KR.UTF-8
LC_TELEPHONE=ko_KR.UTF-8
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:
LC_IDENTIFICATION=ko_KR.UTF-8
LANG=en_US.UTF-8
....


sudo 명령어를 사용할 때 실행한 일반 계정의 PATH 환경을 유지하려면 /etc/visudoers 파일에서 secure_path를 주석 처리하고 아래 명령을 추가 합니다. (그냥 콘솔에서 sudo visudo를 실행하면 /etc/visudoers가 열립니다.)

$ sudo visudo
...

#Defaults       secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"  #  기존부분을 주석처리
Defaults env_keep=PATH  # 새로추가
 
# 만약 특정 유저 그룹만 적용하고 싶다면 아래 줄을 추가
Defaults:%users env_keep=PATH


또 다른 방법으로 .bashrc에서 sudo 명령에 alias를 추가해서 env PATH=$PATH를 잡아주는 방법도 있습니다.

$ sudo vi .bashrc
 
 
alias sudo='sudo env PATH=$PATH'  # 추가

이렇게 하면 sudo 명령을 입력할 때마다 PATH가 자동으로 유지됩니다

ls -al 로 파일의 자세한 정보를 볼 수 있습니다.

$ ls -la
total 8
drwxr-xr-x@  6 root  staff  204  4 18  2016 .
drwxr-xr-x  20 root  staff  680 11  3 14:58 ..
drwxr-xr-x@  9 root  staff  306 12  1 13:16 .idea
-rwxr-xr-x@  1 root  staff  252  4 15  2016 manage.py
drwxr-xr-x@  8 root  staff  272 11 30 10:14 queue
drwxr-xr-x@  7 root  staff  238 11 30 10:14 untitled9

맨앞의 문자가 - 면 파일이고 d 이면 디렉토리, l 이면 링크를 나타냅니다.

r : Read  = 4

w : Write = 2

x : eXcute = 1


-rwxrwxrwx   ( 777 )
-r--r--r--  ( 444 )
-rwx--x--x ( 711 )

2~4필드 : 소유주 ( User ) 권한
5~7필드 : 그룹 ( Group )  권한
8~10필드 : 나머지 ( Others ) 권한

chmod

파일, 디렉토리의 권한을 수정하는 명령어입니다.

$ chmod 755 test.txt # 소유자에겐 7(rwx), 그룹과 나머지에겐 5(r-x) 권한부여
$ chmod o+rw a_file # others에게 읽기, 쓰기 권한 부여
$ chmod 700 * # 현재 위치의 모든 파일과 폴더 권한 수정 
$ chmod -R 755 www # www디렉토리 내의 모든 파일과 디렉토리의 권한 수정

umask

파일이 만들어질 때 권한을 부여하는 명령어입니다.

$ umask 022 # chmod와 반대개념 777에서 빼야함.  022일 경우 chmod 755 와 같음

chown

파일 소유자, 소유그룹 수정을 수정합니다. 

$ chown abcd file1 # file1 파일의 소유자를 abcd로 수정 
$ chown abc:abcd file2 # file2 파일의 소유자를 abc로 그룹을 abcd로 수정
$ chown -cR nobody:nobody dirl # dirl 폴더와 그안의 모든 파일,디렉토리의 소유자,소유그룹 변경
$ chown -R bible:webhost uploads --from=nobody:nobody # uploads디렉토리 내의 파일중 소유자가 nobody이고 소유그룹이 nobody로 되어 있는 파일의 소유자를 bible로 변경하고 소유그룹을 webhost로 변경 


보통 ip주소로 웹을 실행하기 싫다면 DNS 구매하여야 하지만 로컬에 등록하여 나만 DNS를 사용하고 싶다면 /etc/hosts파일을 수정합니다. (윈도우는 잘모름.. git을 설치해서 git bash로 따라하거나 윈도우용 찾는게..)

$ sudo vi /etc/hosts
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1       localhost
255.255.255.255 broadcasthost
::1             localhost
10.10.10.10		dns.test.com # 한 줄 추가

위와 같이 입력하고 저장을 하면 브라우저에 10.10.10.10 ip를 입력하는 대신 dns.test.com으로 접속 할 수 있습니다.

OpenSSL이란?

인터넷을 통해 클라이언트와 서버가 통신할 때 통신 내용을 안전하게 보호하는 방법으로 SSL(Secure Sockets Layer)을 사용할 수 있습니다. SSL은 서버 인증(Server Authentication), 클라이언트 인증(Client Authentication) 그리고 데이타 암호화(Data Encryption) 기능을 제공합니다. 

인증(Authentication)은 통신의 상대방이 맞는지 확인하는 절차를 의미합니다. 암호화는 데이타가 누출되더라도 외부에서 이 내용을 해독할 수 없게 하는 걸 의미합니다. 

SSL을 사용하는 URL은 https 라는 스킴(scheme)을 사용하여 구분합니다. 예를 들어서 이렇습니다.


https://google.com
최근 버전의 SSL은 이제 TLS(Transport Layer Security)라고 이름이 바뀌었습니다. 현재 IETF(Internet Engineering Task Force)가 TLS 표준을 유지 관리하고 있습니다

공개키, 비밀키, 인증서 (Public Keys, Private keys, Certificates)

인증을 수행할 때 SSL은 공개키 암호화(public-key cryptography)라는 기술을 사용합니다. 공개키 암호화는 공개키(public key)와 비밀키(private key) 이 둘의 조합에 근거한 알고리즘입니다. 공개키로 암호화된 데이타는 그 공개키와 짝이 되는 비밀키에 의해서만 해독이 가능합니다. 반대로 비밀키로 암호화된 데이타 역시 짝이 되는 공개키로 해독할 수도 있습니다. 
이 키 쌍을 가지고 있는 소유자는 이 중에서 공개키를 아무에게나 공개할 수 있습니다. 하지만 비밀키는 비밀스럽게 보관해야 합니다. 인증서(Certificate)는 소유자의 공개키가 맞는지를 검증하는 도구입니다.X.509 표준을 준수하는 인증서는 다음과 같은 데이타와 서명(signature) 영역을 가지고 있습니다. 
  • 공개키를 소유하고 있는 자의 구별 가능한 이름 
  • 공개키를 발급(issue)한 자의 구별 가능한 이름 
  • 이 인증서가 언제까지 유효한지를 나타내는 유효기간 
  • 공개키 그 자체
VeriSign과 같은 인증 기관 (CA, Certificate Authority)을 통해 인증서를 발급 받을 수도 있고 스스로 자기 서명 인증서(self-signed cerficate)를 만들 수도 있습니다. 스스로 인승서를 만들었을 경우, 소유자와 발급자가 같습니다. 인증서를 발급하는 인증 기관은 서로간에 어떤 계층(hierarchy) 관계가 있습니다.루트 CA는 자기-서명 인증서를 가지고 있습니다. 하지만 그 하부 CA들은 자기 직속 상관이 발급한 인증서를 가지고 있습니다. 그래서 특정 CA는 이런 인증서들의 묶음을 가지게 되는데 이를 인증서 체인(certificate chain)이라고 합니다. 인증서 체인은 자기 직속 상위 CA가 발급한 인증서를 가지고 있고, 그 상위 CA는 또 그 위의 상위 CA가 발급한 인증서를 가지고 있는 식입니다. 

PEM 포맷

PEM(Privacy-enhanced Electronic Mail) 포맷은 인증기관에서 가장 많이 사용하는 포맷입니다. PEM 인증서는 보통 .pem, .crt, .cer, .key 와 같은 확장자를 가집니다. 이 포맷은 Base64로 인코딩된 ASCII 텍스트 파일이고 "------BEGIN CERTIFICATE----"와 "----END CERTIFICATE----"와 같은 시작과 끝을 알리는 문구가 들어 갑니다. 

OpenSSL 취약점

2014년 4월 HeartBleed라는 버그가 OpenSSL에서 발생하였습니다.

HeartBleed란?

HeartBleed란 OpenSSL 1.0.1 버전에서 발견된 매우 위험한 취약점 입니다. OpenSSL을 구성하고 있는 TLS/DTLS의 HeartBeat 확장규격에서 발견된 취약점으로, 해당 취약점을 이용하면 서버와 클라이언트 사이에 주고받는 정보들을 탈취할 수 있습니다.

 OpenSSL은 정해진 규격의 네트워크 보안 프로토콜을 범용 라이브러리로 구현하기 위한 목적으로 만들어졌으며, SSL이나 TLS를 이용한 암호화를 구현할 수 있습니다. 강력한 암호화 기능을 제공하기 때문에, 보안이 중요한 대형 포털서비스, 이메일 서비스, 금융권 등에서 데이터 통신 시 OpenSSL을 사용하고 있습니다.


 

HeartBleed 취약점은 OpenSSL 라이브러리의 구조적인 취약점입니다. OpenSSL의 확장규격 중 하나인 HeartBeat는 서버와 클라이언트 사이에 무슨 문제는 없는지 또는 안정적인 연결을 유지하기 위한 목적으로 일정 신호를 주고 받을 때 사용하는 확장규격입니다. 클라이언트는 HeartBeat 확장프로토콜을 이용하여 임의의 정보를 그 정보의 길이와 함께 서버에 전송합니다. 그 후 서버는 전달받은 정보를 다시 클라이언트에 전달해 주는 과정을 통해 자신의 존재 사실을 알려줍니다. 

이 때 클라이언트로부터 전달받은 정보와 그 정보의 길이가 일치하지 않는다면, 클라이언트의 요청에 서버는 응답을 하지 않는 것이 정상적인 동작입니다. 이번에 발견된 HeartBleed 취약점은 서버가 클라이언트로부터 전달받은 정보의 내용과 그 정보의 길이의 일치 여부를 검증하지 않은 채 정보를 보내주면서 문제가 발생된 것입니다.


정상적인 요청과 정상적인 반환 값의 예제

payload의 길이를 조작하여 정보유출 예제


payload란 실제 전송되는 데이터입니다. 위 정상적인 요청일 경우 서버에게 요청하는 글자와 글자의 수가 일치하지만 정보유출 예제의 경우 서버에게 요청한 글자와 요청받고자 하는 글자의 수가 일치하지 않습니다. 서버는 이러한 요청을 검증하지 않고 요청받은대로 전달하기 위해 서버내에 저장되어 있는 정보들을 전송하게 됩니다. 이것이 바로 HeartBleed 취약점이 발생되는 과정입니다.

클라이언트는 한번에 최대 64KB의 정보를 요청할 수 있습니다. 실제로 64KB에 들어갈 수 있는 정보는 매우 작습니다. 그러나 해당 취약점을 이용하여 시스템 메모리에 저장되어 있는 무의미한 작은 정보들을 지속적으로 유출시키면, 이러한 무의미한 정보들이 모여 하나의 완전한 유의미한 정보가 될 수 있습니다. 이러한 과정을 통하여 공격자는 시스템 메모리에 저장되어 있는 정보들을 유출시킬 수 있으며, 이 정보들에는 개인키, 관리자 정보 등 민감한 정보들도 포함되어 있습니다. 특히 개인키의 경우 암호화하여 전달되는 데이터를 모두 열람할 수 있는 핵심정보이기 때문에 사안이 매우 심각하다고 할 수 있습니다.


HeartBleed 명칭의 유래는 해당 취약점으로 공격할 때마다 작은 정보들이 새어 나오는 것을, 심장이 한번씩 뛸 때마다(HeartBeat) 심장에서 피가 한 방울씩 떨어지는 치명적인 심장출혈(HeartBleed)로 비유하여 명명한 것입니다.

SSL 인증서 생성

key 파일 생성

key 파일에 패스워드를 넣어 생성하면, 후에 다른 서비스에 연동하여 해당서비스 구동할 때마다 key파일의 암호를 물어봅니다. 패스워드를 제거하더라도 SSL 암호화 통신에는 문제가 없어서 제거해도 상관없습니다. 호스팅업체에서 제공하는 로드밸런서에 사설인증서를 올릴 때에도 패스워드를 제거해야 합니다.

$ openssl genrsa -des3 -out 파일이름.key 1024
$ openssl genrsa -out 파일이름.key 1024 # 패스워드 제거 생성
$ openssl rsa -in 기존파일이름.key -des3 -out 새로운파일이름.key # 기존에 생성된 key파일에 암호 추가하여 재생성
$ openssl rsa -in 기존파일이름.key -out 새로운파일이름.key # 기존에 생성된 key파일의 암호를 제거하여 재생성

인증요청서(csr) 생성

공개키 인증서를 신청하기 위해 신청자가 인증기관에 보내는 메세지입니다. 또는 인증서 발급 신청서(전자문서, 파일)입니다. 해당 파일을 만들기 위해선 key 파일이 존재해야합니다.

$ openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key:  # 서버의 개인키 비밀번호 입력
 
# -> 사용자의 경우에 맞게 적절히 입력
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]: 
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:
 
 
# -> 아래 내용이 필요할 시 비밀번호를 추가적으로 생성할 수 있지만 보통경우 그냥 엔터를 쳐서 넘어가도 무관
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
 
# 서버 인증요청서인 server.csr 파일 생성

인증서(crt) 생성

위에서 만든 개인키와 인증요청서로 인증서를 생성합니다.

$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt 


보통 사용자 계정에 권한을 주려고 visudo로 /etc/sudoers파일을 열거나 vi로 오픈하여 수정합니다. 이때 추가 및 수정한 부분에 대해 에러가 날 경우, sudo 명령어가 먹히질 않습니다.

$ sudo vi /etc/sudoers
 
...(생략)
test ALL=NOPASSWD:vi # 입력
 
:wq!


위와 같이 잘못된 위치를 지정하고 강제로 저장한 다음, 해당 파일을 열려고 하면 아래와 같이 출력됩니다.

$ sudo vi /etc/sudoers
>>> /etc/sudoers: syntax error near line 32 <<<
sudo: parse error in /etc/sudoers near line 32
sudo: no valid sudoers sources found, quitting
sudo: unable to initialize policy plugin


여기서 당황하지 말고 아래와 같이 명령어를 입력합니다.

$ pkexec visudo
==== AUTHENTICATING FOR org.freedesktop.policykit.exec ===
Authentication is needed to run `/usr/sbin/visudo' as the super user
Authenticating as: test,,, (test)
Password:


비밀번호를 맞게 입력하면 에디터가 나오는데 수정했던 가장 마지막 줄을 지운 다음 /etc/sudoers파일로 저장합니다. 저장 방법은 ctrl+x를 누른 다음 y를 눌러 /etc/sudoers.tmp파일 명을 /etc/sudoers로 수정한 다음, 엔터를 치면 됩니다. (아마도)..

에디터 창을 빠져나오면 아래와 같이 작업을 더 할 것인지 묻습니다.

What now?
Options are:
  (e)dit sudoers file again
  e(x)it without saving changes to sudoers file
  (Q)uit and save changes to sudoers file (DANGER!)
What now? Q
$ 

이때 x를 하면 저장이 되지 않으므로 주의합니다.


다 끝났습니다. 아까 안됐던 sudo 명령어를 사용하여 /etc/sudoers 파일을 열어보겠습니다.

$ sudo vi /etc/sudoers
 
...(생략)
#includedir /etc/sudoers.d


  1. 이대희 2017.03.29 22:13

    저도 sudoers 를 편집했더니 뭔가 잘못했는지 sudo -i 명령어가 먹지 않고 님이 설명하신 저런 명령어가
    뜹니다. 하여, 알려주신대로 pkexec visudo 이렇게 쳤더니
    메시지가 \-sh: pkexec: command not found
    이런 메세지가 뜹니다.
    제가 사용하는 서버는 Synology NAS DS214 입니다.
    이유와 해결책을 알 수 있을까요?

    • 불곰1 2017.04.06 14:09 신고

      pkexec 명령어가 없어서 나는 에러라 해당 모듈을 설치한 다음 실행하면 될거예욥

  2. 이대희 2017.03.29 22:14

    혹시 아시면 rototo86@naver.com 으로 알려주시면 감사하겠습니다.

  3. 오날두 2017.06.11 17:24

    안녕하세요
    라즈베리파이3에서 오류가나서 왔습니다.
    pkexec visudo 를 하면
    1. ....(pi)
    2. root
    라는 선택지가 나오고
    둘중 하나를 선택해서 비밀번호를 치면
    polkit-agent-helper-1:error response to policykit daemon: GDBus. Error:org.freed esktop.PolicyKit1.Error.Failed: No session for cookie

    ==AUTHENTICATION FAILED==
    Error executing command as onother user : Not authorized

    라고 뜹니다.

    해결방법이 있을까요?

    • 불곰1 2017.06.14 19:46 신고

      sudo를 앞에 붙여서 해보셨나요?? 현재 로그인된 계정에 권한이 없어서 그런 것 같네용

  4. 지나가는서버개발자 2017.11.13 17:57

    pkexec 명령어가 없어서 모듈을 설치한다음 실행하면 될거에욤 << 직접 해보시고 말씀하시는건가요?

    이미 에러난 상태에서는 sudo 를 쓰든 뭐든 안되요 ^^

+ Random Posts