글을 쓰기 앞서 하기의 사이트를 참조하였습니다.

 

SSH 키 기반 인증이 뭔가요?

원격 컴퓨터에 접속 시 SSH 프로토콜을 사용하여 접속을 많이 시도합니다.

이때, 접속용 비밀번호 입력이 필요한데, 여기에 문제점이 아주 많다고 합니다..

 

[ SSH 비밀번호 인증방식의 문제점 ]

1. 매 접속 시 비밀번호를 입력해야 한다는 불편함이 있습니다.

2  비밀번호 입력 제한이 없어 브루트포스(무작위 대입)를 통해 비밀번호 인증을 시도할 수 있습니다. 

   2-1) fail2ban 과 같은 입력 횟수 제한 및 규칙을 설정할 수 있지만, 여전히 관리자를 괴롭게 합니다..

3. 여러 대의 서버 관리 중 하나의 서버의 비밀번호가 노출 및 탈취? 당하면 대부분의 서버들 또한 안전하지 못합니다..

...

이러한 문제점을 해소하는 방법으로 공개 키파일을 접속 대상 서버에 복사하여 사용할 수 있습니다.

(여기서 다루지 않은 키 구조에 대한 자세한 설명은 아래 설명을 참고하시길 바랍니다)

공개키 기반구조
비대칭키 알고리즘


이 방법을 사용하면 내 서버에서 원격 접속을 시도할 때 다음과 같은 과정을 수행합니다.

( 내 서버 : Client   ,   접속 대상 서버 :  Server )

더보기

1. Client 에서 Server 로 ssh 접속을 시도

2. Server 에서 공개 키를 통해 접속 정보를 암호화하여 Client 로 전송

3. Client 에서 본인이 소유한 비밀 키를 통해 Server 의 공개 키로 암호화된 접속 정보를 복호화 합니다.

4. Client 가 올바른 접속 정보를 확인하며, 정상적으로 Server 로 접속합니다.

 

위 과정은 초기 접속 시도할 때 비밀번호 입력이 필요하고, 이후 SSH 접속 시 자동적으로 수행되어 비밀번호 없이 접속이 가능합니다. 

ssh-copy-id 가 뭔가요?

위에서 언급했던 공개 키파일을 접속 대상 서버에 복사하는 명령어 입니다.

비밀번호 방식대신 키 기반 인증을 사용하는 방법을 보여드리겠습니다.

 

먼저 사용할 키쌍 (공개키-비밀키) 를 생성합니다.

$ ssh-keygen -t rsa -b 2048 

Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): #키파일 경로 입력 (/root/.ssh/my_key)
Enter passphrase (empty for no passphrase): #비밀번호 입력
The key's randomart image is: #비밀번호 입력
+---[RSA 2048]----+
|      oo+*=.     |
|      .+++=.     |
|      .= =o.     |
|     .. +.*      |
|      .oS..*     |
|     ..=ooo.o.   |
|     .oo .o=o.   |
|      o .+E.+o   |
|       .oo=+. .  |
+----[SHA256]-----+

키를 생성했습니다.

이제부터 개인 키는 제한된 디렉토리에 보관되었습니다.   제한된 디렉토리 : /root/.ssh 

( SSH 클라이언트는 제한된 디렉토리에 보관되지 않은 개인 키를 인식하지 않습니다. ) 

 

키 생성 후 반드시 해야하는 작업이 있습니다, 바로 키 권한을 변경해주어야 합니다.

키 자체 권한을 600으로 바꾸어야, 시스템 외 다른 사용자가 스누핑할 수 없게 됩니다.

즉, 사용자 계정 또는 루트 계정에 대한 권한을 먼저 획득하여야 함을 의미합니다.

chmod 600 /root/.ssh/my_key

 이제 내 공개키를 접속 대상 서버에 복사를 합니다.

ssh-copy-id -i /root/.ssh/my_key USERNAME@REMOTE_HOST

접속 대상 서버의 호스트를 모르는 경우 수동으로 복사할 수 있습니다.

접속 대상 서버의 .ssh/authorized_key 파일에 공개 키파일의 내용을 추가만 하면 됩니다!!

 

이제 기존 비밀번호 인증 방식을 비활성화 해줍니다.

$ vi /etc/ssh/sshd_config

vim에서 /PasswordAuthentication 검색 
주석을 해제하고 no 값으로 설정한 후 vim 편집기에서 나옵니다.

$ systemctl restart sshd 

ssh 데몬을 재시작해주면 설정된 구성이 반영됩니다.

이제 비밀번호 없이 키 파일 기반으로 SSH 접속이 가능해졌습니다!!!!

여러 서버들을 사용중이라면 동일하게 구성하여 1대의 마스터 서버에서 쉽게 접속(제어)할 수 있습니다. 

 

 

위 과정을 동일하게 수행하면서 에러가 발생할 수 있습니다. 

아마도 사용자 계정과 루트 계정의 혼동으로 인한 문제일 수 있어 확인이 필요합니다.

 

혹여나, 공개 키를 삭제한 경우는 비밀 키로 기존과 동일한 공개 키를 생성할 수 있습니다.

더보기

ssh-keygen -f  (비밀 키 파일명) -y > (공개 키 파일명).pub

 

하지만, 위와 같이 공개 키를 복사하지 못하는 경우가 있을 수 있습니다.

그런 경우 비밀번호 방식을 사용하면서 추가적인 비밀번호 입력을 하지 않는 방법도 있습니다.

바로, ssh-agent 를 통해 메모리에 임시로 비밀번호를 캐시하는 방식입니다.

$ eval $(ssh-agent)
$ ssh-add /root/.ssh/my_key

ssh-agent 는 ssh 접속을 시도할 때 자동으로 수행할 스크립트를 지정하는 역할이라고 볼 수 있습니다.

 

'🐧Linux > 📟Shell' 카테고리의 다른 글

WSL2 ( set init process to systemd )  (0) 2022.12.11
exit code  (0) 2022.08.14

Load Balancer(이하 로드밸런서) 에 대한 내용은 이전에 간략하게 다루어 봤습니다.

 

Load Balancer

Load Balancer 가 뭔가요? 1000명 이상의 사용자가 서버로 어떠한 요청을 보낼 때 1대의 서버로는 모든 요청을 처리하는데 한계가 있겠지요. 따라서 여러 대의 서버로 요청을 분담하여 처리해야 하는

nomer26.tistory.com

 

이제는 AWS의 Elastic Load Balancer (이하 ELB) 에 대한 개념과 내부 동작을 간략히 설명하겠습니다.

글을 쓰기 앞서 아래 링크를 참조하였습니다.


ELB 구성

ELB는 Public (Internet) 과 Private (Internal) 영역에 생성이 가능합니다.

Public ELB는 공인IP와 사설 IP를 모두 가지며, 인터넷과 VPC 내부 리소스간 통신이 가능합니다.
즉, ELB 는 NAT Gateway 없이도 Private 과의 통신이 가능합니다.

Private ELB는 사설 IP만을 가지고 VPC 내부에 생성되어 내부 통신을 할 수 있습니다.

 

ELB 생성 시, EC2와 유사한 ELB 인스턴스(로드밸런서 노드)가 생성됩니다.

로드밸런서 노드는 Listener 와 Load Balancer 로 구성되어 있습니다.

  • Listener 는 사용자가 지정한 프로토콜+포트와 일치하는 요청을 수신합니다.
  • Load Balancer 는 수신한 요청을 적절한 대상으로 로드밸런싱합니다.

그리고 ELB 로부터 요청을 넘겨받을 Target Group 을 설정해주어야 합니다.

Target Group은 여러 개의 백엔드 서버들로 구성되며, 해당 서버에서 수신할 요청의 스펙을 정의할 수 있으며,

로드밸런서 노드가 Target Group의 정의된 스펙에 맞게 요청을 넘겨줍니다.

또한, Target Group은 로드밸런서로부터 서버들이 정상적으로 동작하는 주기적으로 검사하는 Health Check 기능을 수행하며, 자동으로 정상적인 서버에만 요청을 전달합니다.

( 구체적으로 말하자면, 로드밸런서는 Target Group 의 서버들을 서버풀(Pool) 로 관리합니다.
 Health Check 를 수행해 비정상적인 응답을 보내오는 서버들은 서버풀에서 제외시키며, 고가용성을 보장합니다. )

ELB는 Target Group의 모든 서버들이 비정상적인 응답을 하게되면 ELB 동작을 비활성화합니다.

만약, 알고리즘으로 세션이 갱신되는 상황을 방지하기 위해 Sticky Session 을 고려할 수 있습니다.

Sticky Session 은 처음 커넥션이 구성된 서버와 일정 시간동안 세션을 유지할 수 있도록 도와줍니다.

TCP 프로토콜은 350초이며, UDP 프로토콜은 120초로 세션이 유지됩니다.


그럼 이제 AWS ELB 서비스를 대표하는 NLB 와 ALB 에 대하여 간략히 알아보겠습니다.

NLB는 인스턴스로 생성이 되지만 AWS 측 LB 물리장비와 연결되어 동작합니다.

ALB는 인스턴스로 생성되어 Software Load Balancer 위에서 동작합니다.

두 LB의 차이가 보이시나요?   바로 Layer 의 수준이 다르다는것을 한 눈에 볼 수 있습니다.

 

NLB 는 L4 수준의 프로토콜(TCP, UDP)과 즉각적인 L4라우팅을 담당합니다.

ALB 는 L7 수준의 프로토콜(HTTP, HTTPS)을 다루며, 데이터를 직접 확인하기 때문에 정확한 전송이 가능합니다.

 결론적으로, L4 는 무지 빠릅니다,  그리고 L7은 다양하고 정밀한 라우팅이 가능합니다.

이대로는 아쉬우니 NLB, ALB 의 특징을 조금만 더 알아보겠습니다.

NLB 

ALB


위 내용은 AWS Docs 에서 가져왔습니다. 그 중 문서에서 찾아볼 수 없는 궁금한 내용들을 간략히 알아보겠습니다.

  • NLB 만 고정 IP 를 지원합니다.

고정 IP 는 각 AZ 별 1개씩 생성이 가능하며 인스턴스(VM) 에  할당하여 사용가능한 리소스입니다.

NLB, ALB 둘 다 결국 인스턴스(로드밸런서 노드) 가 생성되어 할당이 가능해야하는데 왜 NLB만 지원할까요?

그 답은 ELB의 고가용성(HA) 에 있습니다. NLB는 매우 빠른 요청처리가 가능하며, 각 AZ 별로 생성 가능합니다.

또, 로드밸런서 자체적으로도 하는일이 거의 없습니다. 기껏해야 SNAT, DNAT , 포트포워딩이며, DSR을 활용 시 인바운드 트래픽만을 처리하기 때문에 변동이 거의 없는 안정적인 운용이 가능합니다. (이후에 부가적으로 설명하겠습니다.)

반면, ALB 는 패킷의 내부 데이터 헤더를 확인하여 정확한 경로(대상)로 전송해야할 의무가 있습니다.

따라서, ALB 내부적으로 처리해야하는 작업의 부담이 있으며, 요청 트래픽의 크기와 양에 따라 ALB 로드밸런서 노드를 추가로 생성/삭제하여 안정적으로 운용하려고 합니다.

ALB 로드밸런서 노드가 Scale In/Out 하는 과정에 있어 IP 가 수시로 바뀌기 때문에 고정 IP 를 할당하는데 있어 적합하지 않습니다.

( ALB에 고정 IP를 할당하고 싶다면 앞 단에 NLB를 생성한 후 타겟 그룹으로 ALB를 지정하는 방법이 있습니다. )

 

  • NLB 는 보안 그룹을 사용할 수 없습니다.

보안그룹은 인스턴스 수준에서 인/아웃 바운드 트래픽을 제어하는 리소스로 ENI에 붙여 사용합니다.

인스턴스 당 5개의 보안그룹을 사용할 수 있고, 방화벽의 역할을 하지만 허용(Allow) 만 제어가 가능합니다.

그렇다면, 왜 NLB는 보안 그룹을 사용할 수 없을까요?

물론, AWS의 기술력이 부족한 이유는 절대 아니며, 사용할 수 있게 만들수는 있지만 본래 의도와 다르기 때문입니다.

NLB 특성 상 대량의 트래픽 처리가 가능하며 이에 따라 뒷 단에 요청을 받는 서버는 고가용성 보장이 가능해야 합니다.

즉, Scale 변동이 가능한 오토스케일링 그룹(ASG) , ALB 가 오는 경우가 많습니다.

이는 NLB와 인스턴스 타입으로 사용할 수 있고,  NLB + 인스턴스 타입의 조합은 소스 IP 를 그대로 전달합니다.  

소스 IP를 그대로 받는다는 것은 NLB가 요청받는 소스IP 와 백엔드 서버단에서 받는 소스 IP가 동일함을 의미합니다.

이렇게 되면 NLB에서 굳이 보안그룹을 사용해야 하는가? 에 대한 물음으로 이어질 수 있겠습니다. 

더보기

NLB는 VPC에 연결된 로드 밸런싱 리소스의 유사한 그룹이지만 일반 ENI 대신 AWS Hyperplane ENI를 사용합니다.

Hyperplane ENI는 단일 IP 주소를 통해 여러 기본 로드 밸런싱 리소스를 투명하게 연결하기 위해 EC2의 소프트웨어 정의 네트워크(SDN)와 통합되는 분산 구조입니다.

참조 :https://stackoverflow.com/questions/63235672/why-is-it-that-an-nlb-in-aws-does-not-require-a-security-group

 

추후 Target Type (Instance mode, IP mode) 와 IP 보존에 대한 이야기를 덧붙이도록 하겠습니다.

또, 로드밸런서의 라우팅방법에 대해서도 간략히 이야기해보겠습니다.

 

로드 밸런서 라우팅 방법 : https://ssup2.github.io/theory_analysis/SLB/

Load Balancer 가 뭔가요?

1000명 이상의 사용자가 서버로 어떠한 요청을 보낼 때 1대의 서버로는 모든 요청을 처리하는데 한계가 있겠지요.

따라서 여러 대의 서버로 요청을 분담하여 처리해야 하는데, 사용자는 각 서버의 IP 주소를 모르며, "tistory.com" 이라는 URL 주소만 알고있습니다.

tistory.com
( 10.123.24.54  LB의 IP)
192.168.10.10
192.168.12.22
192.168.11.15

그러므로 "tistory.com" URL 주소와 각 서버의 IP 를 묶어주는 역할이 필요한데,

LB는 자신의 IP를  "tistory.com" 도메인과 연동하여 자신이 수신하는 모든 요청을 각 서버에게 자동으로 분산합니다.

(정확히 말하자면 "tistory.com" 을 LB의 IP 로 변환해주는 동작은 DNS Server가 처리하며, LB는 서버에게 요청을 전달하는 동작을 수행합니다. ) 

따라서, LB를 사용하면 서버를 안정적으로 운용할 수 있습니다.  

LB는 대충 아래와 같은 구조로 사용됩니다.

출처 : Medium (Crack FAANG)

어떻게 자동으로 분산할 수 있나요?

로드밸런싱 알고리즘을 통해 요청을 자동으로 분산할 수 있습니다.

 

로드밸런싱 알고리즘

  • Round Robin
  • IP Hash
  • Least Connection ( Least Outstanding Requests )

이외에도 여러가지 알고리즘이 있지만, 대표적으로 사용되는 3가지의 알고리즘을 알아보겠습니다.

 

Round Robin

Round Robin 방식은 요청의 종류,크기와 관계없이 각 서버에 순서대로 한 번씩 요청을 분산합니다.

IP Hash

IP Hash 방식은 요청 패킷의 출발지 IP/Port , 목적지 IP/Port , 프로토콜 종류를 조합하여 해시값을 만든 후,

해당 해시값과 일치하는 서버에게 분산합니다.

Least Connection

Least Connection 방식은 서버중 현재 요청을 가장 적게 처리하고 있는 서버에 분산합니다.

 

 

'📡Network' 카테고리의 다른 글

IP Class , NAT  (0) 2022.08.14
IP  (0) 2022.08.14
IPtables  (0) 2022.08.13

System has not been booted with systemd as init system (PID 1). Can't operate. Failed to connect to bus: Host is down

WSL 에서 systemctl 명령을 사용하면 위와 같은 에러가 발생하는데 init process (1번 프로세스) 가 systemd 로 시작되지 않았기 때문입니다.

 

systemd 명령을 사용하려면 아래와 같이 수행해야합니다. 

sudo apt-get update && sudo apt-get install -yqq daemonize dbus-user-session fontconfig
sudo daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
exec sudo nsenter -t $(pidof systemd) -a su - $LOGNAME

unshare 명령으로 pid 를 격리하여 1번 프로세스를 systemd 로 수행하는 데몬을 생성합니다.

'🐧Linux > 📟Shell' 카테고리의 다른 글

SSH 키 기반 인증? ssh-copy-id?  (0) 2022.12.17
exit code  (0) 2022.08.14

글을 쓰기 앞서 이 영상을 참조했습니다.

 

 

Garbage Collector 가 뭔가요?

코드를 작성할 때 선언 후 사용되지 않는 변수가 메모리를 차지하고 있는 일종의 Bug 로 Memory Leak 이라고 합니다.

이런 변수들을 사용자가 직접 지워줘야 했던 작업들을 대신해주는 기능을 Garbage Collector (GC) 라고 합니다.

 

Garbage Collector 가 왜 필요한가요? 

이전에 말했듯이 불필요하게 메모리를 낭비하고 있는 상태로

메모리는 속도나 프로세스 사용시간 등의 성능과 직결되기 때문에 중요합니다.

따라서, 메모리 자원을 효율적으로 사용개발자의 작업 효율성 및 생산성에 있어 Garbage Collector 가 필요합니다.

 

Garbage Collector 는 어떻게 동작하나요?

Referece Count ( 참조 횟수 ) 를 통해 더 이상 참조되지 않는 변수들을 처리합니다.

 

또, 다음과 같은 경우에도 GC가 알아서 처리합니다.

 이것이 가능한 이유는 모든 변수들의 생성과 참조에 있어 GC가 관리하기 때문입니다.

그래서, GC가 쓰레기변수들을 처리할 때 속도가 급격히 느려지는 경우가 있는데,

이는 멀티스레드방식을 활용하면서 코드 실행 중 간간히 작업이 수행되어 크게 느끼지 못할정도라고 합니다. 

 

 

추후 보충 자료
https://beststar-1.tistory.com/15
https://mangkyu.tistory.com/118

백준 사이트의 10217 번 문제 KCM Travel 문제를 풀어보았습니다.

 

매주 월요일마다 진행하는 알고리즘 스터디에서 Python 언어를 활용해 풀이한 내용들을 공유합니다.

 

 

저는 알고리즘 문제를 풀어본 지 6개월이 넘은 것 같습니다. 그래서 그런지,, 머리가 백지상태가 되었어요. ㅠㅠ

 

먼저 저는  https://www.youtube.com/watch?v=B4Ivp_ebm4c 이 영상을 참고하여 문제를 풀었습니다.

 

목적  :  인천에서 LA까지 M원 이하로 사용하면서 도착할 수 있는 가장 빠른 길

 

조건 : 
   T : 테스트 케이스의 수


  공항의 수 N (2 ≤ N ≤ 100)  ,  총 지원비용 M (0 ≤ M ≤ 10,000)  ,  티켓정보의 수 K (0 ≤ K ≤ 10,000)

 

  K개의 줄에 걸쳐 각 티켓의 출발공항 u, 도착공항 v (1 ≤ u, v ≤ N, u ≠ v), 비용 c (1 ≤ c ≤ M, 정수),

  그리고 소요시간 d (1 ≤ d ≤ 1,000)


  인천은 언제나 1번 도시이고, LA는 언제나 N번 도시이다


 찬민이 LA에 도착하는 데 걸리는 가장 짧은 소요시간을 출력한다

  만약, LA에 도착할 수 없는 경우 "Poor KCM"을 출력한다.

 

 

문제를 처음 보고 다익스트라의 느낌이 확 와닿았습니다.

다만, 고려해야할 가중치가 1개 뿐인 전형적인 다익스트라의 알고리즘 문제들만 풀어봤기에,

위 문제는 고려해야할 조건이 (소요 시간,비용) 2가지인  문제라고 판단했고, 접근방법에서 부터 막혔습니다.

 

위 참고영상에서의 문제 풀이를 보고 다시 문제의 조건을 보니 냅색문제와 유사하다는 것을 알았습니다.

가방의 공간 : 물건의 무게  = 지원 비용 : 소요 시간  , 다소 차이가 있지만 이런 식으로 생각했습니다.

 

위와 같이 예를 들었을 때,   ( 공항의 개수는 4개 입니다,  5,6 행은 무시해주세요 )

소요 비용을 순서대로 탐색하며 각각의 공항에서 이동가능한 경우를 찾아 최소 소요 시간을 적용합니다.

 

위의 예시는  도착 지점(N) 에서 지원 비용을 만족하지 못해  "Poor KCM" 이 결과로 출력됩니다.

 

이와 같은 문제들을 타개하기 좋은 방법은

고려할 조건을 분명히 하고, 1차원 또는 2차원의 테이블로 그려보는 것도 좋은 방법같습니다.

 

이하 다른 스터디원분들의 풀이 방법입니다.

import sys
import heapq

input = sys.stdin.readline
for _ in range(int(input())):
  n, m, k = map(int,input().split())
  graph = {i:[] for i in range(1, n+1)}
  for i in range(k):
    a, b, c, d = map(int,input().split())
    graph[a].append([b, c, d])
  visited = [[int(1e9)]*(n+1) for _ in range(m+1)]
  q = [[0,0,1]]
  while q:
    cost, time, now = heapq.heappop(q)
    if cost > visited[time][now]: continue
    for v, c, d in graph[now]: continue
      if time + c <= m and cost + d < visited[time+c][v]:
        for i in range(time+c,m+1):
          if visited[i][v] > cost + d: visited[i][v] = cost + d
          else: break
        heapq.heappush(q,(cost+d,time+c,v))
  print(visited[m][n] if visited[m][n] != int(1e9) else "Poor KCM")
import sys

INF = sys.maxsize
input = sys.stdin.readline

T = int(input())
for _ in range(T):
  N, M, K = map(int,input().split())
  graph = [[] for _ in range(N+1)]
  for _ in range(K):
    departure, arrival, expense, time = map(int,input().split())
    graph[departure].append((arrival, expense, time))
    
  arrival_expense = [[INF]*(M+1) for _ in range(N+1)]
  arrival_expense[1][0] = 0
  
  for e in range(M+1):
    for d in range(1,N+1):
      if arrival_expense[d][e] == INF:
        continue
        
      temp_time = arrival_expense[d][e]
      
      for da, de, dt in graph[d]:
        next_expense = de + e
        if next_expense > M:
          continue
        arrival_expense[da][next_expense] = min(arrival_expense[da][next_expense],temp_time + dt)
  result = min(arrival_expense[N])
  print([result, 'Poor KCM'][result==INF])

글을 쓰기 앞서 이 책을 참조하였습니다.

 

쿠버네티스 인증에는 어떤 것들이 있나요?

 

  • Service Account 오브젝트를 통한 인증
  • Open ID Connect  (OAuth) 와 같은 third party 를 통한 인증
  • Certificates (인증서)를 통한 인증  등이 있습니다.

 

쿠버네티스 사용 시 인증이 왜 필요한가요?

 

운영중인 서비스에 대한 보안 강화 및 기밀 정보 보호의 목적 뿐만 아니라,

사내 조직 간의 쿠버네티스 동시다발적 제어 및 접근에 있어서

RBAC (Role Based Access Control)  역할에 따른 최소 권한 할당에 있어서 중요한 역할을 합니다.

 

 

쿠버네티스의 인증과정은 어떻게 이루어지나요? 

일반적으로 위와 같은 과정으로 Kubernetes API Server 에서 인증이 진행됩니다.

  1. Kubectl 명령어를 통해 Kube-API Server에 HTTP Handler 에 요청을 전송
  2. API Server 는 해당 클라이언트가 쿠버네티스의 사용자가 맞는지 확인
  3. API Server 는 해당 클라이언트가 요청한 기능을 실행할 권한이 있는지 확인 
  4. 관리자의 정책에 따라 Admission Control 을 수행합니다.

 

API Server 가 인증을 어떻게 하나요?

 

앞서 설명했다시피  Service Account, third party , Certificates 와 같은 방법들이 있습니다.

우선 Service Account 오브젝트를 활용하여 인증하는 방법을 설명하겠습니다.

 

Service Account (SA) 는 체계적으로 권한을 관리하기 위한 쿠버네티스 오브젝트입니다.

k create sa [Service Account Name] -n [ namespace ]

 위와 같이 SA 생성이 가능하며, 다음과 같이 활용할 수 있습니다.

그러나, SA 오브젝트만 있어서는 인증이 불가능하며, SA 에 직접  접근 대상, 접근 권한, 권한 주체를 설정해주어야 합니다.

Role 이라는 오브젝트로 아래와 같이 rule 을 적용하여  SA에 RoleBinding 을 통해 Role 을 할당해 주어야 합니다.

또, Namespace 에 속한 리소스들을 대상으로 다루는 Role 과  Cluster 전체 리소스들을 다루는 Cluster Role 이 있습니다.

 

그러면, Kubectl 을 통해서만 SA 를 활용할 수 있나요?

 

Application 에서 또한 HTTP API 를 통해 API Server에 요청이 가능합니다.

우선, HTTP API 요청을 위한 API Server Endpoint 로  다음과 같습니다.

기본적으로 API Server 는 HTTPS 요청만을 처리하기 때문에, 인증에 대한 자격증명이 필요합니다.

SA 오브젝트를 생성ㅇ하면 해당 SA에 대응하는 Secret 이 자동으로 생성됩니다.

해당 Secret 에는 ca.crt , token , namespace 가 base64 로 인코딩되어 저장되어 있습니다.

 

이에 Application 에서는 Token 정보를 읽어 API Server 에 JWT 인증을 시도합니다.

이후, 기존 SA 정보를 바탕으로 인증 및 인가 과정을 처리하게 됩니다.

그리고, API Server 의 몇몇 특정 경로들은 접근 제한이 되어있으나, Cluster Role 을 통해 아래와 같이 설정하여 접근이 가능합니다.

 

 

마지막으로, 다음과 같이 SDK 를 통한 SA 인증이 가능합니다.

1. SA 를 생성 한 후 Role 과 Role Binding 을 적용해줍니다. 

2. 대상 Pod 에 SA 이름을 명시합니다.

3. 해당 Pod 의 Container 에 자동으로 Secret 정보가 마운트됩니다.

4. Token 정보를 읽어 기존 default namespace 의 kubernetes 서비스를 통해 API Server 에 인증을 시도합니다.

 

 

RBAC 이 왜 중요한건가요?

추후 작성 예정

Admission Controller 가 뭔가요?

추후 작성 예정

OIDC 나 Certificates 를 통한 인증은 어떻게 하나요??

새로운 글로 작성 예정

 

 

Time Zone Error

RDS 의 Timezone 설정은 기본값으로 "UTC" 로 되어있습니다.
시간대가 서울을 기준으로 한다면 RDS의 파라미터 그룹 설정을 다시 해주고 재부팅해야 합니다.

1. 파라미터 그룹 생성 

2. time_zone 파라미터를 [Asia/Seoul] 로 설정해줍니다.

3. 기존 DB 수정의 추가 구성에 들어가 파라미터 그룹을 생성한 파라미터 그룹으로 변경합니다

4. DB 를 재부팅합니다.

 

 

 

Q. IP Class 는 뭔가요?

 

하나의 네트워크가 몇 개의 호스트를 가질 수 있는지에 대한 단위 개념입니다.

즉, 네트워크와 호스트를 구분할 수 있는 단위라고 생각합니다.

 IP Class 는  A  ~  E Class 가 있습니다.

 

Q. 네트워크와 호스트를 구분할 수 있는 것은 서브넷 마스크 아니었나요?

 

IP Class 도 결국 /8 , /16, /24 .. 과 같이  Default Subnet Mask 를 가집니다.

사실 서브넷팅 하는 방법에 있어 Classful 방식으로 IP Class 를 활용하는 방법

Classless 방식으로 IP Class 개념없이 서브넷팅 (VLSM) 하는 방법이 있습니다.

 

Q. IP Class 의 각 Class 는 무엇을 의미하나요? 

 

자세한 설명은 여기를 참조하세요

 

A Class  :  Network : 0.0.0.0  ~ 127.255.255.255      SubnetMask  255.0.0.0       Hosts : 16,777,214

B Class  :  Network : 128.0.0.0 ~ 191.255.255.255      SubnetMask  255.255.0.0       Hosts : 65,534

C Class  :  Network : 192.0.0.0 ~ 223.255.255.255      SubnetMask  255.255.255.0       Hosts : 254

D Class  :  Network : 224.0.0.0 ~ 239.255.255.255      특수목적용  ( 멀티캐스트 )

E Class  :  Network : 240.0.0.0 ~ 247.255.255.255      IP 연구용

 

A , B Class 의 경우 기업이 아닌경우  호스트 수가 매우 크기 때문에 낭비가 심할 수 있습니다.

그래서 대부분 네트워크를 나눌 때 C Class 를 따릅니다.

이러한 이유로 사설 네트워크망은  192 로 시작하는 경우가 많습니다.

 

Q. 제 IP 는 59.142.xxx.xxx 인데  어떻게  사설 IP로 사용할 수 있다는 건가요?

 

NAT ( Network Address Translation ) 를 통해서  공인망(인터넷망) <~> 사설망  통신이 가능합니다.

 

 Q. NAT 는 또 뭔가요?

 

NAT 는 주소를 변환해주는 서비스입니다.

  -  IP 주소 절약  :  하나의 공인  IP 주소를 여러 호스트가 나누어 사용할 수 있습니다.

  - 보안   :  NAT 특정으로 IP 를 숨길 수 있는 기능이 있습니다.

 

출처 : https://rednooby.tistory.com/25

동작 방식   

예 )  내 컴퓨터에서 구글로  '모코코'를 검색합니다.    [ 사설 IP : 10.0.0.1   , 공인 iP : 150.150.0.1  , 구글 IP : 200.100.10.1 ]

1.  내 컴퓨터 (사설 IP) 에서 구글에 패킷전송 

   ( 패킷 헤더에  Src/Dst IP 가 기록됩니다.   Src : 10.0.0.1 / Dst : 200.100.10.1  ,  출발지,도착지 IP 주소입니다. )

2. 기본 게이트웨이에서 외부로 나가는 패킷을 인식합니다.

    2-1 . 출발지 IP 주소를 게이트웨이 자신의 공인 IP 주소로 변경합니다.

    2-2 . 이때, NAT 테이블에 보관합니다.  (  10.0.0.1 ~> 150.150.0.1 ) 

 

https://www.stevenjlee.net/

3. 구글 웹서버에서  패킷을 수신 후 처리를 수행합니다.

   3-1 .  응답 패킷을 전송합니다.      ( Src : 200.100.10.1    /  Dst : 150.150.0.1 )

4. 기본 게이트웨이에서 응답패킷을 수신합니다.

  4-1 . 기록해두었던 NAT 테이블을 참조하여 도착지 주소를 사설 IP (10.0.0.1 ) 로 변경합니다.

 

추가적으로 NAT의 여러 쓰임에 대해 설명하자면

 

SNAT  ( Source NAT ) :   사설망 ~> 공인망   

DNAT  ( Destination NAT )  공인망 ~> 사설망  

 

추가적인 내용은 SNAT , DNAT 를 확인하세요

 

 

주소할당 방식에 따른 NAT 

 

Static NAT  ( 1:1 NAT )

 - 공인 IP 와 사설 IP 주소가 1:1 로 매칭되는 방식입니다.

    -  IP 절약 효과는 없으며  ,  Port Forwarding 목적으로 사용합니다.   ( 사설 서버 IP 를  공인 IP 로 매핑하기 위한 목적 )

    -  Port Fowarding  :  하나의 서버에서 여러 서비스를 운영중일 때

                                      특정 서비스에 임의의 포트를 지정하여 해당 포트를 통해 서비스의 경로를 지정하는 방법입니다.

Dynamic NAT  ( N:N NAT )

  - 여러 개의 공인 IP 주소 대비  사설 IP가 더 많을 경우  현재 사용중이지 않은 공인 IP 에 사설 IP 를 동적으로 매핑합니다.

     - IP 절약 효과를 위해 사용합니다.

 

PAT  ( Port Address Translation ) 또는 PNAT  ( Port NAT )

  - 공인 IP 1개와  여러 개의 사설IP를 매핑합니다.  ( 공인 IP 의 포트마다  각각의 사설 IP 의 포트와 연결할 수 있습니다. )

 

자세한 내용은 여기를 참조하세요

 

 

 

Q. 이전에 소개된 서브넷팅은 뭐고 VLSM 은 뭔가요?

 

서브넷팅은  서브넷 ( Sub network )을 나누는 방법입니다.

 

우리가 할당받은 네트워크를 좀 더 효율적으로 사용하기 위해 여러 개의 서브 네트워크로 쪼개서 사용할 수 있습니다.

서브넷팅을 하는 방법으로 2가지를 위에서 소개했는데,

 Classful  :  기존 IP Class 별 Default Subnet Mask 를 사용합니다.   /8 , /16,  /24 ...

 Classless :  IP Class 의 개념없이 서브넷팅을 하는 방법입니다.   ( VLSM 한 경우 )  ( CIDR 표기 )

 

 예 )  필요한 IP 개수가 있을 때    ex. 컴퓨터 30대와 연결해야 하는 경우   (  임의의 네트워크 배정  ~>  193.1.2.0/24 )

 

  /24  (SubnetMask)  =  255.255.255.0  

   1111 1111 . 1111 1111 . 1111 1111 . 0000 0000   <~ 여기서 서브넷팅

 

  30대가 필요하니 최대한 낭비없이 할당하는 것이 중요합니다.

8 bit 에 30개를 포함시키기 위해서는   2^5 = 32 개   2진법 => 11100000  

따라서, 서브네트워크 개수는 ( 111   10진법 => 8 개 )     그렇다면, 서브넷 표기는  /24 + 3 = /27  ( CIDR 표기 ) 

 현재 생성한 서브네트워크는 8개로  각 서브네트워크 마다 32 개의 호스트를 가집니다.

193.1.2.0/27  193.1.2.32/27
193.1.2.64/27  193.1.2.96/27
193.1.2.128/27  193.1.2.160/27
193.1.2.192/27 193.1.2.223/27

 

VLSM ( Variable Length Subnet Mask ) :  가변 길이 서브넷 마스크

 위의 예로 설명한 방법이 VLSM 방식입니다.   

 ( 이 경우  반드시   xxx.xxx.xxx.xxx / xx   형식의 CIDR 표기를 해주어야 합니다.)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'📡Network' 카테고리의 다른 글

Load Balancer  (0) 2022.12.11
IP  (0) 2022.08.14
IPtables  (0) 2022.08.13

 

Q. IP가 뭔가요?

 

Internet Protocol 의 약어로  인터넷을 통해 정보를 송·수신 하기 위한 프로토콜 입니다.

보통은 IP 주소의 의미로 사용되며   사람들마다 고유의 휴대폰 번호가 있듯이 컴퓨터도 고유의 IP 주소를 가집니다.

 

Q. IP 주소로 뭘 할 수 있나요?

 

내 IP 주소를 검색해보면  xxx.xxx.xxx.xxx 형식의 숫자들을 볼 수 있습니다. 

이 주소로 인터넷을 통해 다른 IP주소와 통신할 수 있습니다,  (검색포털 Google 도 IP 주소를 가지고 통신을 합니다)

Q. IP 주소는 고유하다면서 똑같은걸 본 적이 있는데요?? 

 

아마도 내부 네트워크의 사설 IP 주소를 고려할 수 있을 것 같습니다.

우리가 흔히 볼 수 있는 사설 IP 주소로는 192.168.xxx.xxx 와 같이 생긴 숫자들을 볼 수 있습니다.

이는 공유기를 통한 사설 IP 망에 주로 사용되는 IP 형식입니다.

 

Q. 내부 네트워크는 뭐고 사설 IP 는 뭔가요?

 

IP 주소를 보면  . 으로 각 영역을 구분하는데 3자리 숫자로 이루어진 숫자값은 이진 수 8 bit 로 표기할 수 있습니다.

ex)  192  ~> 11000000      이 8 bit 를 옥텟 (Octet) 이라고 합니다.

 

IP 주소는 옥텟에 따라 네트워크 부분 - 호스트 부분으로 나눌 수 있습니다. 

 

네트워크 부분 : Broadcast Domain  ( 라우터를 거치지 않고 통신을 할 수 있는 대역망 )   # (02) 지역번호의 역할을 합니다.

호스트 부분 :     PC 가 할당받을 수 있는 영역  # 전화번호 역할을 합니다.

 

네트워크와 호스트 영역을 구분하는 이유

" 하나의 네트워크는 네트워크 부분이 모두 같아야 하며 호스트 부분은 모두 달라야 하기 때문입니다. " 

호스트 부분이 같으면 충돌이 발생합니다.    ( 같은 전화번호가 2개가 있는 경우는 없습니다. )

 

다시, 질문으로 돌아가서  내부 네트워크는  컴퓨터의 수가 많아짐에 따라 고유 IP 는 턱없이 부족해지고 있습니다.

따라서, 고유 IP 주소를 아껴서 사용해야만 합니다.

 

예를 들면,  공유기의 고유 IP 주소로  192.168.xxx.xxx 형태의 별도의 내부 네트워크를 만들어 컴퓨터, 스마트폰 등의 전자기기에 사설 IP 를 부여합니다.

이렇게 되면 기존에는 고유 IP 주소 2개 이상이 필요했지만 사설 IP 로 대체되어 고유 IP 주소를 아낄 수 있습니다.

그리고 모든 사설 IP들을 사용하는 기기들은 인터넷을 사용할 때 공유기의 고유 IP 주소를 통해 통신합니다.

 

Q. 네트워크와 호스트를 나눌 수 있다고 했는데 어떻게 나누는 건가요?

 

네트워크와 호스트를 구분하는 방식은 서브넷 마스크 (SubnetMask) 를 사용합니다.

 

Q. 서브넷 마스크는 뭔가요?

 

 네트워크를 만들기 위해 마스크를 씌우는 작업(연산) 입니다.  ( 서브넷팅 이라고 합니다 )

 

Subnet_mask  - 255.255.255.0   |  IP - 192.168.11.31

 

  Subnet_mask  =>  1111  1111   .  1111 1111   . 1111 1111   . 0000 0000     (255.255.255.0)

         IP              =>  1100  0000  . 1010 1000 .  0000 1011  . 0001 1111     (192.168.11.31)

   ---------------------------------------------------------------------------------------------

   Network          =>   1100  0000 .  1010 1000 .  0000 1011  . 0000 0000    ( 192.168.11.0 )

 

IP (192.168.11.31) 는 Network ( 192.168.11.0 ) / Subnet_mask ( 24 ) 에 속하는 호스트입니다.

* Subnet_mask 는  8bit 의 1의 개수로 표기합니다. 

  1 은 네트워크 대역을  0 은 호스트 대역을 의미합니다. 

    연속된 1의 중간에 0 이 존재할 수 없습니다. 

'📡Network' 카테고리의 다른 글

Load Balancer  (0) 2022.12.11
IP Class , NAT  (0) 2022.08.14
IPtables  (0) 2022.08.13

+ Recent posts