외부에서 root계정에 로그인 할 수 없도록 막자


환경 및 선수조건


sshd_config 파일 수정하기

의외로 간단하게 sshd_config 파일에서 수정만 하면 됩니다.

다음 아래 파일을 vim 혹은 다른 편집기를 통해서 엽니다.

$vim /etc/ssh/sshd_config

다음 아래처럼 PermitRootLogin yes를 다음처럼 PermitRootLogin no로 변경합니다.

  • PermitRootLogin yes -> PermitRootLogin no

RootLoginYes RootLoginNo


ssh 바뀐 설정 적용하기

다음 명령어를 통해 바뀐 설정을 적용해줍니다.

$ /etc/init.d/ssh restart

#아무런 반응이 없다면

$ service ssh restart

만약 적용되지 않는다면 재부팅해주면 적용되어있습니다.

$ sudo reboot

해킹당하지 않기 위한 기초로 서버를 호스팅하고 키를 발급해 접근을 해보자


환경

  • Mac
  • ssh-keygen(키 발급)
  • ssh-copy-id(서버에 공개키 전송)
  • 원격서버(Ubuntu 16.04) 및 추가된 유저


현재 환경은 Ubuntu 16.04버전에서 진행을 하겠습니다. Mac기준으로 포스팅을 하였으며 Mac에서 Remote Server에 접근해 보겠습니다.


ssh-copy-id 설치

보다 빠르게 설정을 하기 위해 ssh-copy-id를 사용하겠습니다.

  • ssh-copy-id: Local에서 발급한 공개키를 서버로 전송할 때 사용할 수 있는 패키지입니다.


Homebrew를 통한 설치

Homebrew가 설치되어 있다고 가정 했을 때 설치법은 아래와 같습니다.

$ brew install ssh-copy-id

추가적으로 원격서버 IP 주소는 알고 있으며 유저가 추가되었다고 가정을 하고 진행하겠습니다. 제가 추가한 유저는 test 입니다.

유저 추가에 대한 자료는 호스팅한 Ubuntu 서버에 유저 추가하기를 참고하세요!


Mac에서 SSH Key 발급

편의상 ~/.ssh의 폴더에서 진행을 하겠습니다.

우선 저희가 Key를 현재 로컬 컴퓨터에서 발급을 해야합니다. Mac 혹은 Ubuntu에서는 다음과 같은 명령어로 발급이 가능하니다.

  • -t는 dsa, ecdsa, ed25519, rsa, rsa1 중에서 어떤 형식의 암호화 알고리즘을 선택할지 결정하는 옵션입니다.

  • -b는 key를 만들때 몇 bit의 key를 만들지 결정하는 옵션이며 기본값은 2048입니다.

$ ssh-keygen [-t] [rsa] [-b] [2048]

옵션을 사용하지 않는 예시

$ ssh-keygen

그러면 아래와 같이 file이 저장될 위치와 passphrase를 입력하면 완성이 됩니다.

file을 입력할 때 파일 위치를 입력해도 되고 원하는 파일의 이름을 입력하면 ~/.ssh/[key name] 형태로 들어가게됩니다. 저는 test라고 키 이름을 짓겠습니다.

passphrase는 key와 함께 사용하는 비밀번호입니다. 현재는 편의상 사용하지 않겠습니다.

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/taewoo/.ssh/id_rsa): test (실제로는 여기에 파일 경로 혹은 이름을 넣어주시면 됩니다.)
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in test.
Your public key has been saved in test.pub.


ssh-copy-id를 통해서 손쉽게 ssh public key를 서버에 보내기

위의 과정을 제대로 진행했다면 ~/.ssh 폴더에 private keypublic key가 생성되어 있습니다.

저는 testtest.pub가 생성되었습니다.

Keys

이제 ssh-copy-id를 통해서 원격 서버에 public key를 보내봅시다. 사용법은 아래와 같습니다.

$ ssh-copy-id -i [key path or name] [Username in Server]@[IP Address]

사용 예시

$ ssh-copy-id -i test.pub test@[IP Address]

실제로 진행을 해보면 아래와 같습니다.

Taewooui-MacBook-Pro:.ssh taewoo$ ssh-copy-id -i test.pub test@[IP Address]
/usr/local/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "test.pub"
/usr/local/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/local/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
test@[IP Address]'s password:

Number of key(s) added:        1

Now try logging into the machine, with:   "ssh 'test@[IP Address]'"
and check to make sure that only the key(s) you wanted were added.

로그인을 해봐서 키가 추가되었는지 확인해달라고합니다. 원격 서버에 해당 User로 로그인하고(지금과 같은 경우는 test유저 입니다.) ~/.ssh 폴더에 authorized_keys 파일에 키가 저장되어 있는지 확인합니다.


Mac에서 ssh로 원격서버에 SSH KEY를 통해서 접속하기

사용법은 다음과 같습니다.

$ ssh -i [private key name] [Username]@[IP Address] -p [port number]

실제 접속을 하면!

$ ssh -i test test@[IP Address]

Login Success


Mac에서 ~/.ssh/config를 통해 ssh 접속을 간편하게 하기

Mac에서는 ~/.ssh/config 파일을 통해서 보다 쉽게 접속을 할 수 있습니다.

~/.ssh에 config라는 파일을 생성합니다.

$ touch config

해당 config 파일에 ssh 접속에 대한 정보를 아래 형식에 따라서 입력하시면 됩니다.

Host Name1
    HostName [IP Address]
    User [Username]
    Port [Port Number]
    IdentityFile ~/.ssh/[private key name]

Host Name2
    HostName [IP Address]
    User [Username]
    Port [Port Number]
    IdentityFile ~/.ssh/[private key name]

여기 내용대로 진행을 하셨다면 아래처럼 입력하시면 됩니다.

Host Test
    HostName [IP Address]
    User test
    IdentityFile ~/.ssh/test

그러면 Host 다음에 오는 이름만으로도 간단하게 접속이 가능합니다.

$ ssh Test

얼마전 호스팅한 서버에서 중국이 해킹해… 초당 2MB 정도로 패킷을 거의 2주간 전송하고 있다고 해서 netstat을 정말 열심히 사용해 어떤 프로세스가 그러한 요청을 보내는지 알아보려고 하다가 netstat을 좀 써보게 되었는데 그 내용을 포스팅한다.

환경

  • Ubuntu 16.04


netstat이란?

  • netstat: network statistics의 줄임말로 네트워크 인터페이스나 프로토콜 상에서의 통계를 보여주는 소프트웨어 혹은 도구입니다. 대체로 네트워크의 성능을 측정하고 네트워크 상의 문제점을 파악할 때 많이 쓰입니다.


기본적인 netstat의 명령어를 사용하시면

  • 외부와 통신하는 상태를 알려주는 Active Internet connections

  • 내부에서 프로세스들끼리 소통하는 상태들을 알려주는 Active UNIX domain sockets에 대한 내용을 확인 할 수 있습니다.


netstat 사용법 및 간단한 옵션

netstat의 예시

기본적인 명령어는 아래와 같으며 명령어를 실행하면 다음과 같은 결과가 나옵니다.(Active Connections의 경우)

$ netstat

Netstat First

  • Proto: 해당 통신이 사용하는 프로토콜을 나타냅니다.
  • Recv-Q and Send-Q: 해당 통신이 사용할 때 소켓 사이즈 버퍼를 의미하며 Recv-Q의 경우 recv()를 통해 처리 받지 못한 데이터를 의미하며 Send-Q의 경우 send()를 통해 보냈지만 아직 완전하게 외부로 보내지지 않은 데이터의 크기를 의미합니다.
  • Local Address and Foreign Address: 말 그대로 해당 통신에서 나가는 내 주소와 목적지에 해당하는 주소를 의미합니다.
  • State: ESTABLISHED, LISTEN과 같은 상태를 나타냅니다. 상세한 부분은 TCP/IP 통신을 따로 보시면 되고 나중에 시간되면 이 부분도 포스팅하겠습니다.


netstat에 옵션을 주기

이제 netstat 명령어에 옵션을 주어 더 상세한 정보를 보도록 하겠습니다. 모든 옵션들을 보여주기에는 힘드니 제가 특정 프로세스를 확인 할 때 사용하였던 옵션들을 나열하겠습니다.

  • “-a”: ESTABLISHED 뿐만 아닌 모든 State에 대한 소켓들의 정보를 보여줍니다.
  • “-n”: 도메인 명이 아닌 숫자 ip주소를 표시해줍니다.
  • “-p”: 어떤 프로세스에서 해당 통신을 사용하고 있는 지를 보여줍니다.
$ netstat -anp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:[port]           0.0.0.0:*               LISTEN      2007/beam
tcp        0      0 0.0.0.0:[port]           0.0.0.0:*               LISTEN      1498/redis-server 0
tcp        0      0 0.0.0.0:[port]           0.0.0.0:*               LISTEN      1816/epmd
tcp        0      0 0.0.0.0:[port]           0.0.0.0:*               LISTEN      1538/sshd

Netstat with options


다음에는 더 공부해서 네트워크와 Linux에서 환경설정을 어떻게 하면 더 튼튼한지 이런부분에 대해서 더 포스팅해보겠습니다.

서버를 호스팅 받았을 때 Ubuntu 14.04 LTS x64 기준으로 어떻게 유저를 추가하는지에 대해서 포스팅한다. 5분 컷!


맥에서 ssh로 서버에 접속하기

맥의 터미널에서는 바로 ssh에 접속이 가능하다.

22번 포트가 아닌 다른 포트를 사용하고 싶다면 -p를 통해서 포트번호를 입력 받을 수 있다.

$ ssh [원격지서버 User ID]@[Host]
...
$ ssh [원격지서버 User ID]@[Host] -p [포트번호]

예시

$ ssh root@123.456.789.123 -p 22


root계정의 비밀번호 변경하기

임대받은 서버의 경우에는 비밀번호를 임시로 제공해주는데 이를 변경하고 싶다면 다음과 같다. 아주 간단하게 다음 명령어만으로 가능하다. (여기까지는 금방금방!)

$ sudo passwd root

이렇게 명령어를 실행해주면 다음 아래와 같이 실행이 된다. 리눅스에서는 비밀번호를 터미널 창에 표시해주지 않는다.

$ sudo passwd root
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully


현재 시스템에 유저를 추가하기

root 계정에 있을때 사용자 유저를 추가하려면 아래 명령어를 치면 간단하게 추가가 가능하다.

$ adduser [추가하는 사용자 이름]

진행하면 아래와 같이 커맨드 창에 나오면 필요한 정보들은 입력해주시면 됩니다.

$ adduser nelp
Adding user `nelp' ...
Adding new group `nelp' (1002) ...
Adding new user `nelp' (1002) with group `nelp' ...
Creating home directory `/home/nelp' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for nelp
Enter the new value, or press ENTER for the default
	Full Name []:
	Room Number []:
	Work Phone []:
	Home Phone []:
	Other []:
Is the information correct? [Y/n] y

P.S. 유저를 위의 방식으로만 추가하면 sudo 명령어를 사용할 때 sudoers가 아니어서 sudo 명령어를 사용 할 수 없다고 나오는데 그럴 때는 처음부터 아래처럼 유저를 추가하시거나 위에처럼 추가하시고 아래 명령어를 실행하셔도 됩니다.

adduser [추가하는 사용자 이름] sudo

혹은

usermod -aG sudo [추가하는 사용자 이름]


현재 시스템에 유저를 삭제하기

간단하다. 다음 아래와 같은 명령어를 사용하면 됩니다.

$ deluser [User Name]

이렇게 하면 계정만 삭제된다고 하며 모든 정보들을 함께 삭제하려면 다음과 같이 -remove-all-files를 붙여줘야 합니다.

$ deluser -remove-all-files [User Name]


현재 시스템의 유저 정보를 보기

유저 정보 확인

유저 정보를 볼 수 있는 방법은 /etc/passwdcat 명령어를 통해서 출력하면 됩니다.

$ cat /etc/passwd

그러면 다음과 같이 :으로 구분된 정보들이 출력됩니다.

$ cat /etc/passwd
...
twpower:x:1000:1000:,,,:/home/twpower:/bin/bash
...

:을 통해서 구분된 모습이 보이며 각 위치마다 나타내는 정보는 다음과 같습니다.

[사용자계정]:[x(비밀번호)]:[사용자 ID]:[Group ID]:[,로 구분된 계정 정보]:[홈 디렉토리]:[로그인 쉘]


유저 암호 정보 확인

유저 암호정보를 볼 수 있는 방법은 /etc/shadowcat 명령어를 통해서 출력하면 됩니다.

$ cat /etc/shadow

그러면 다음과 같이 :으로 구분된 정보들이 출력됩니다.

$ cat /etc/shadow
...
twpower:$6$qujW8gO(생략)hpT3z.:17242:0:99999:7:::
...


참고자료

다음 아래 홈페이지에서 많은 내용을 참고하여 토대로 작성하였습니다.

http://mirwebma.tistory.com/112

앞에서 UTC, Timezone, ISO 8601 그리고 python에서 그러한 형태에 따라서 어떻게 자료를 가공해야하는지에 대해서 다루었다면 javascript json으로 date관련 문자열을 넘겨 받았을 때 Date객체로 어떻게 변환하는지에 대해서 알아본다.


이전 포스트

UTC, Timezone, ISO 8601의 개념이랑 python에서 간단한 예제를 미리 보고 싶으신 분은 ISO 8601과 UTC 그리고 python 예제를 참고하시길 바랍니다!


Javascript 날짜와 시간 관련 class

Javascript에서는 Date라는 class를 사용해서 날짜 관련 처리를 해주는데 기본적으로 아래와 같은 기능들을 모두 지원해준다.(편하다)

  • 현재 컴퓨터에서 설정된 시간과 날짜를 참고해 Date관련 클래스를 생성해주고 년/월/일T시:분:초.밀리초의 정보를 다 get 및 set이 가능하다.
  • 현재 컴퓨터에서 설정된 시간 기준으로 UTC 표준시에 관한 부분들도 다 get과 set을 지원해준다.
  • ISO 8601 형식 및 JSON(UTC 기준시로 나타내줍니다. - 즉 Timezone이 적용된 ISO 8601형태로 뽑아줍니다.)

자세한 설명은 코드를 직접 작성하기보다 w3shcools에 너무 잘 나와있어서 링크를 첨부하겠습니다.


JSON(in ISO 8601 format) => Date객체

그러먼 JSON으로 온 date관련 문자열을 어떻게 Date클래스로 만들 수 있는지 보도록 하겠습니다.

기본적으로 Date class에 있는 contructor에서 자동으로 파싱을 해서 생성합니다.

var date = new Date("2017-03-17T09:38:51.249Z")

/*
다음 아래들도 다 같은 표현입니다.
*/

date = new Date("2017-03-17T09:38:51.249Z")

// KST(UTC로 부터 9시간이 더해진 한국 표준시)를 나타내는 표현식으로도 가능합니다.
date = new Date("2017-03-17T09:38:51.249+09:00")

P.S. 기본적으로 Timezone에 대한 정보 없이 milliseconds나 날짜로만 입력하면 자동으로 Local Timezone으로 입력이 됩니다.