0부터 시작하는 Linux 공부 - 원격 서버에 접속 해보자

Jaehong Lee·2022년 7월 19일
0
post-thumbnail

0. 원격지에 있는 서버로 접속하는 방법

    1. CLI - telnet (x), ssh (O)
    1. GUI - VNC, SPICE, PCoIP

SSH 단계

  1. 서버에 대한 인증
  2. 사용자에 대한 인증

    Key-Pair / Password 이용

1. wget & curl

  • wget : 특정 웹 주소로 부터 파일등을 다운로드 하기 위한 툴
  • curl : 웹 사이트 주소를 통하여 해당 페이지의 코드를 다운로드 하거나 api 연결, 파일 다운로드 등에 활용된다

wget 사용해보기

  • wget으로 gedit 파일을 다운 받자

curl 사용해보기

  • 웹 사이트 주소에 접속해서 index.html 을 출력해보자
  • 네이버에 접속하면 다음과 같이 나온다. 네이버는 https 이므로, redirection 되서 다음과 같이 나온다
  • -L 옵션을 사용할 때, 포트포워딩이 되어 있다면, 해당 페이지까지 들어가서 코드의 내용을 확인한 뒤 화면에 출력시켜준다
  • 다음과 같이 뒤에 -o 옵션을 통해 해당 파일에 결과를 담을 수 있다
  • curl 을 이용하여 웹 페이지의 헤더 내용도 담고 싶으면, -i 옵션을 사용하면 된다
  • 이렇게 네이버의 헤더 정보를 담을 수 있다
  • head로 상위 정보만 볼 수 있다
  • head -n 을 하면 상위 n번째 줄까지 출력한다
  • tail -n 은 하위 n번째 줄까지 출력한다
  • curl -O http://www.test.com/test.zip : 인터넷 상의 파일을 다운로드 가능하다

2. proxy 서버

  • 내부 사용자들의 웹 접속 속도 향상 / 인증 등을 거쳐 인터넷 사용가능

  • url filter 적용 또는 특정 컨텐츠 필터링을 통한 보안에도 활용이 가능하다

  • curl x ---proxy 서버 주소 : 포트 번호 -L 실제 목표하는 주소

  • Proxy 서버를 통해 외부 인터넷 접속

    1) client가 www.naver.com 로 가려고 하면 proxy에게 www.naver.com 가고 싶다고 함
    2) proxy 서버가 cache에서 www.naver.com 찾아보고 없으면 자신이 대신 www.naver.com 에 다녀와서 client에게 전해줌
    3) client2 가 www.naver.com 으로 가려고 proxy 서버에게 요청하면 proxy를 cache에서 바로 www.naver.com을 응답해줌 -> 속도가 빠름

  • Proxy 서버를 통한 보안
    내부 사용자들이 요청한 데이터에 대해서 url filter, file filter 등을 적용해 보안을 지킴

3. Run level

  • 네임스페이스 : 별도의 독립적인 작업 공간을 가질 수 있다

  • cgroup : 각각의 별도의 작업 공간에 별도의 리소스를 적용시킬 수 있다

  • 런 레벨이란? 유닉스 시스템에서 부터 시작되었으며, 시스템을 실행할 때 사용할 기능을 구분해서 실행 시키는 것. 0 ~ 6 번까지 있다

  • init 뒤에 번호를 붙인다 ( ex. init 0 )

    • 0 : halt 로 시스템 종료해주는 것으로 power off / shutdown -P now 이기도 하다
    • 1 : single user mode 로 복구모드다. 단일 사용자 모드로 root 계정으로만 로그인이 가능하며, 시스템 관리적 목적으로 사용. 네트워크 및 다중 접속 불가
    • 2 : multiuser 로 네트워크를 사용하지 않는 다중 사용자 모드, 여러 계정으로 로그인 가능. level 3 에서 네트워크를 사용하지 않는 것과 동일
    • 3 : full multiuser mode로 일반적인 CLI 부팅은 level 3이다. 네트워크를 지원하는 다중 사용자 모드
    • 4 : unused로 사용하지 않는 런레벨이다. 사용자가 정의해서 사용 가능
    • 5 : x11 로 네트워크가 지원되는 multiuser로 그래픽 환경으로의 부팅
    • 6 : 재부팅 , reboot / shutdown -r now 라고 쓰기도 한다
      • shutdown -c : 예약된 종료 / 재부팅을 취소
      • shutdown -r 22:00 : 22시에 재부팅 예약
      • shutdown -k + 15 : 현재 시간으로부터 15분 후에 종료된다는 것을 접속된 사용자들에게 알려주지만 실제로 종료가 되지는 않는다

4. Run level 조작하기

  • multi-user.target 으로 설정해서 run level 3 로 설정하고, 재부팅을 해보자
  • 다음과 같은 CLI 환경으로 부팅된다
  • 처음 부팅할 때 화면에 보여주는 메시지 ( Message Of The Day ) - MOTD
  • 명령어 startx 로 그래픽 환경으로 돌아올 수 있다

  • MOTD는 다음 파일로 설정이 가능하다

5. 네트워크 관련 명령어

  • 가상 머신 두 개를 키고, 각각 이름을 설정한다

네트워크 관련 명령어 종류

  1. IP 확인 : ip addr list / ip addr show
    • 7은 201 / 8은 111 로 설정되있다. 201은 서버로, 111은 클라이언트로 사용해보겠다

  • 서로 통신을 확인해보자
  1. net-tools를 설치하고, ifconfig로 확인
  • net-tools는 기본적으로 설치되있다
  • ifconfig ens32로 ens32만 확인할 수 있다
  1. ip route : 라우팅 테이블 확인

  2. netstat -nr : 라우팅 테이블 확인

  3. nslookup : DNS 서버에게 QUERY 하여, 지정한 도메인의 IP 주소를 확인할 수 있다

  • DEFAULT SERVER : 현재 서버의 기본 DNS 서버
    • #53은 PORT의 번호로 일반적인 DNS 서버는 UDP/53에서 서비스 한다 ( TCP/53 에서도 제공한다 )
  • canonical name 은 별칭이다. 즉 www.naver.com을 www.naver.com.nheos.com.으로 부르기도 한다는 거다. 별칭의 별칭도 알려준다
    • 하나의 도메인 네임을 다른 이름으로 매핑시키는 도메인 네임 시스템의 리소스 레코드의 일종이다. 하나의 IP 주소로부터 여러 개의 서비스를 실행할 때 편리함
  • 최종적으로 e6030~이라는 별칭에 도달하여, 이 주소의 Ip를 알려준다
    • canonical name ( cname ) : 일반적으로 도메인에 대한 Ip 정보는 TYPE A 로 보인다. 허나, 여러 서버가 하나의 도메인을 활용하는 경우에는 cname 을 사용하여 구성한다
  • 다음과 같이 바로 A 타입으로 나올 수도 있다
  1. /ETC/HOSTS : 서버 이름과 해당하는 IP 주소가 기록되있는 파일
  • 파일을 열지 않고, hosts 파일에 Ip 주소와 서버 이름을 추가해준다
  • 서버 이름으로 잘 통신이 된다
  • centOS 8에도 등록해서 통신 확인하자
  1. ifup / ifdown
  • 네트워크 인터페이스 활성화 / 비활성화
  • 활성화 될때는 인터페이스의 구성 파일을 읽고 실행된다. 따라서 Ip 주소등을 변경했을 때에는 systemctl restart network 를 이용하거나 특정 인터페이스를 down > up 하여 활성화 하면 변경된 사항을 적용시킬 수 있다
  • down 하면 ens32에 Ip주소가 빠져있다
  • up으로 다시 활성화 시킨다

6. SSHd 설정

  • ssh 실행되고 있는지 확인하자
    • ssh_config : 클라이언트 입장에서 외부에 접속할때 설정
    • sshd_config : 서버 입장에서 원격지에서 접속했을 때 제공할 서비스에 대한 설정

  • port 번호를 확인하자
  • ListenAddress는 접속할 수 있는 Ip이다. 0.0.0.0 이므로 모든 Ip가 접속가능하게 했다

  • 원격지에서 접속할 때 root로 로그인하는 것을 허용하는 것으로, 보안상 좋은 설정은 아니다

  • 한 번에 접속할 수 있는 최대 사용자 수

  • public key 인증에 대한 설정

  • password 인증에 대한 설정

    • 현재 key-pair 인증 방식은 주석 처리 되있고, password 인증만 활성화 되있다. 원격지에서 ssh에서 연결할 때 key-pair로 인증하게 하고 싶으면, 주석 해제 처리 하면 된다
    • pubkey 설정에 주석 처리를 해제해서 활성화하게 설정했다. 이제 재부팅으로 변경 사항을 반영 시키자
    • sshd를 재부팅 해서 변경 사항을 반영 시켰다
  • 만약, 위 과정을 진행하면서 오류가 난다면 어떻게 해결할까?

  • 서비스의 상태를 확인해보면 무슨 오류인지 확인할 수 있다

  • journalctl -xe 로도 확인 가능 하다

7. 원격지에 있는 서버로 접속해보자 - password

  • 접속할려고 하면, 다음과 같은 메세지가 뜬다. 일단 CTRL + C 로 돌아오자
  • 클라이언트가 서버에 접속하려고 할 때, 서버는 자신의 KEY를 클라이언트에게 저장한다. 이 KEY를 통해 서버의 KEY와 비교하여 서버에 대한 인증이 가능하다
  • YES하고, 접속해서 로그인하면 접속된다
  • EXIT하면, 다음과 같은 폴더와 안에 다음과 같은 파일이 있다
  • 파일을 열어보면, centos7에 대한 public 키가 저장되있다. 이를 이용해 다시 접속할때 서버는 또 키를 보내지만, 해당 키가 저장되있는 것을 확인하고, 키를 저장하게 하지 않을 것이며, 서버에 대한 인증이 가능하다
  • 다시 접속해보면, public 키를 저장할 것인지 물어보지 않을 것이다
  • 이 서버 인증을 통해, 클라이언트는 자신이 접속하고자 하는 서버가 맞는지 인증한다
  • ssh-keyscan 으로 centos7에서 key를 가져와 .ssh 디렉토리의 known_hosts 파일에 저장했다

8. 원격지에 있는 서버로 접속해보자 - key pair

  • 위에서는 사용자 인증을 password를 통해 인증 했다. 이번에는 key pair로 인증해보자
  • 서버에 public key를 두고, 클라이언트가 private key를 가져가게 구성하자
  • 인증 방식

    • 서버 인증은 클라이언트가 서버에게 요청
    • 클라이언트 인증은 서버가 클라이언트에게 요청
    • 클라이언트가 서버에 처음 접속하면, 서버는 서버 인증을 위한 key를 전달하여 클라이언트의 .ssh/known_host에 저장한다. 이를 이용해 다시 접속할 때 서버 인증을 할 수 있으며, key를 다시 저장하지 않는다
    • 서버 인증 후 클라이언트 인증을 위해서는 password 와 key pair 방식이 있으며, password는 보안상 좋지 않다
    • keypair는 pub과 pri를 생성해서 pri는 클라이언트에게 전달하며, pub은 서버의 authorized_keys에 모두 저장한다. 클라이언트 인증시 이 pub과 pri 키를 비교하여 클라이언트 인증을 한다
    • 인증 성공시 세션 생성

  • .ssh 디렉토리 밑에 testkey.pem 파일로 key를 생성한다
  • -N은 " " 안에 passphrase를 지정하여, 생성되는 key와 섞어서 암호화하여 더 고도화된 key를 제공해주는 옵션으로, passphrase 추가하여 인증하면, key로 인증하고, 지정한 passphrase를 입력해야한다. 우리는 " " 을 통해 공백을 주어 passphrase를 추가하지 않는다
  • passphrase는 로컬 머신에서 private key를 해석하는데 사용한다. 이는, 일종의 비밀번호로 비공개키를 입력한 값으로 암호화한다

  • 다음과 같이 key 파일이 생성된 것을 확인할 수 있다
  • 뒤에 pub은 public key다
    • 다수의 user에 대한 public key는 authorized_key 파일에 모두 저장한다. 이를 통해 user 들은 자신의 private key와 서버에 저장된 public key를 비교할 수 있다

  • public key를 복사하여 authorized_keys를 만든다

  • cat으로 pem 파일을 확인하고, 안에 private key를 복사하자

  • centos8로 넘어와서 pem 형식자로 파일을 하나 만들고, 안에 복사한 key를 복사한다. 반드시 맨 밑에 공백이 없게 하자

  • testkey.pem이 root 사용자만 사용할 수 있게 설정하자

    • chmod 600 은 파일에 대한 권한을 rw-------로 변경한다. 600은 rw------의 8진법 퍼미션 값이다

  • 접속을 해보면 password를 물어보지 않고, 잘 접속된다
  • 직접 접속하지 않아도, 뒤에 실행할 명령어를 입력해서 명령을 실행할 수 있다

user 1 용 key pair도 만들어보자

  • user 1 으로 접속해서 key를 생성하고, pub key를 authorized_keys에 저장하자

  • user1.pem 파일을 cat으로 열어 복사하고, centos8에 들어와서 파일을 만들어 private key를 저장하고, user 1 만 사용할 수 있게 설정한다

  • 다수의 서버가 있을 때, 이 방식을 사용하면 클라이언트는 다수의 서버에 대한 private key를 가지고 있어야 되서 번거롭다

    • 실제 환경이라면 관리 서버에서 key-pair 를 생성한다
    • 관리자는 private key를 갖는다. public key는 내가 관리하고자 하는 다수의 서버에 등록 시킨다
    • 원격지에 있는 서버에 public key를 등록하기 위해서는 ssh-copy-id 를 이용해서 관리용 서버의 .ssh/authorized_keys에 등록시킨다
    • 우리는 인스턴스 템플릿 이미지에 미리 public key를 넣어둘 예정이다

9. normal user를 super user로 만들어보자

  • 계정을 만들고 pw를 설정한다. pw는 다음 두 가지 방법으로 가능하다
    • 앞에 user20은 user 이름 , 뒤에 user20이 password다
    • 사용자 이름과 암호 조합을 전송하는 방법

  • 한 줄로 생성도 가능하다
  • 잘 생성이 됬는지 확인하자
  • 방화벽을 재시작할려고 해도, 권한이 없어서 실패한다
  • 일반 사용자는 systemctl restart firewalld 와 같은 시스템에 대한 제어권한이 부여되어 있지 않다. 이를 일시적으로 root 의 권한을 얻어서 사용하고자 한다면 sudo를 이용해 가능하다
    • 현재 user1은 가능하지만, user30은 불가능하다고 하다. 이는 user30이 sudoers 파일에 포함되지 않았기 때문이라고 한다. 이 파일은 내부에 등록한 계정에 대해 권한을 준다

  • root로 돌아와서 확인해보면, 현재 wheel 그룹에 포함된 user에게만 권한을 모두 허가한다고 나와있다. 따라서, user1은 wheel 그룹에 포함되어 있고, user30은 wheel 그룹에 포함되어 있지 않은 것을 확인 가능하다
  • 밑에는 wheel 그룹에 포함된 user에 대해 password도 입력 받지 않고 바로 실행이 되게 하는 설정으로, 위에 설정을 주석 처리하고, 이 설정을 주석 해제하면 적용된다
  • -aG를 통해 user30이 wheel 그룹에 포함되게 설정한다. 따라서 현재 user30은 user30 그룹 ( primary group ) 과 wheel 그룹에 포함되어 있다
  • 이제 방화벽 재실행이 가능해지며, password를 입력하지 않아도 실행된다

10. 질문

  • 인증 방식에서 key는 각각 두 개가 생성되는 것인가? 그렇다 두 개 생긴다
  • 서버 인증 키는 양쪽 다 public 인가? 그렇다 두 개 다 public. 서버 인증 키는 서버가 생성될때 .ssh/ 안에 생성되며, 서버 인증 키는 대칭 키이다
  • .ssh 밑에 authorized_keys는 지정된 이름인가? 그렇다 sshd_config에 설정되있다
    • 안에 다수의 user에 대한 public key들이 있는데 이를 구별하는 방법 및 인증 할때는 순차적 비교하는가? 각 public key 마지막 부분에 유저 정보가 있으며, 이를 통해 구분하고, 인증은 순차적으로 진행해서 해당 유저에 대한 키를 찾는다
  • keygen 에서 -q , -f , " " 의 의미는? -q는 quick mode, -f 는 file, " " 는 추가할 passphrase를 의미한다
    • 이 passphrase는 기본 생성 키에 섞어서 추가되는데, 이걸 추가하면 키 인증외에 지정한 passphrase를 입력하라고 한다. 즉, 보안이 강화되며 이 passphrase 와 기본 생성 key를 섞어서 암호화 하기에 키의 길이가 길어진다
profile
멋진 엔지니어가 될 때까지

0개의 댓글