서버를 개발하거나 유지보수를 할 때, 

보통 서버가 원격지에 있는 경우가 많기 때문에,

putty 또는 telnet과 같은 터미널로 접속해서 로그를 확인, 설정 변경과 같은 작업을 하게 됩니다.


http 프로토콜의 기본 포트가 80번 포트인 것처럼, ssh 도 기본 포트 22번을 사용하는데,

모든 UNIX 계열 ( 리눅스 ) 는 관리자 ID 가 root 이고 이는 변경이 되지 않기 때문에 

일단 id가 외부에 알려져 있습니다.


따라서, 비밀번호를 추측하거나 무작위대입공격을 통해 접속하는 시도에 대한 보안이

필요합니다.


원격접속 보안을 위해 수행할 작업의 순서는 다음과 같습니다.


1. root 로 접속이 안되기 때문에 대신 접속할 user를 생성한다.

2. root 로 로그인을 시도할 수 있는 su ( switch user ) 명령어를 특정 그룹만 사용가능하게 제한한다.

3. 내가 사용할 user 계정을 su 명령어를 사용할 수 있는 그룹에 추가한다. 

4. ssh 설정파일의 root 접속에 대한 제한을 설정한다.

5. ssh 로 root 로그인을 통해 설정 적용이 잘 되었는지 확인한다.





1. 원격접속을 위한 유저 생성





현재 상태는 위의 그림처럼 root로 원격 접속 시도 및 로그인이 되는 상황입니다.







이에대한 보안을 위해 pauli 라는 유저를 추가하고 

# useradd pauli


생성한 유저의 비밀번호를 설정합니다.

# passwd pauli

# 비밀번호 입력 엔터

# 비밀번호 입력 확인 엔터





2. 스위치 유저 명령어 권한 설정


root의 권한 ( 관리자의권한 ) 을 아무나 사용하면 안되기 때문에 

일반 유저계정을 생성해서 스위치 시도도 하지 못하도록

유저변경 명령어에 대한 권한을 설정합니다.



유저변경 명령어는 su 이고 해당 명령어의 경로는 

일반적으로 /bin/su 에 있습니다.


1) 해당 파일의 권한 및 소유자 그룹을 보기위해 ls 명령어로 해당 파일을 조회합니다.

# ls -al /bin/su


파일의 권한은 rwsr-xr-x 이고 소유자 root 소유그룹 root 입니다.

기본적으로 리눅스에서 권한은 3분류로 나눠집니다.

유저

그룹

그외

그리고 그 순서대로 각각 읽기 쓰기 실행으로 나열되며

rwx 란 읽기 쓰기 실행하기에 대한 권한이 있다는 것입니다.


위 그림처럼 rwsr-xr-x 인 경우 소유자인 root는 읽고쓰고 실행할 수 있고,

root 그룹 또는 그외 사용자는 읽기와 실행에 대한 권한이 있는 상태입니다.


그리고 앞의 x대신 s가 표시되어있는 이유는 해당 파일이 실행될 때,

마치 소유자가 실행한 것과 같은 권한을 주는 것인데, 


다른 계정으로 로그인같은 경우 관리자의 권한이 없이는 불가능하게 막아놨기 때문입니다.

유저와 그룹은 그나마 괜찮지만 그외유저가 읽거나 실행하는 권한은 일단 막아야 합니다.

그리고 앞의 과정에서 추가한 계정이 그룹권한을 이용해서 su 명령을 사용할 수 있게 설정도 해야합니다.



2) 해당 파일에 대한 그룹 소유자를 wheel (리눅스의 기본 관리자그룹명) 이라는 그룹으로 설정합니다. 

# chgrp wheel /bin/su


# ls -al /bin/su

명령을 통해 확인해보면 소유 그룹이 변경되었음을 알 수 있습니다.


#chmod 4750 /bin/su

해당 파일에 대한 권한을 4750으로 변경합니다.

앞의 4는 setuid bit입니다.

위에서 설명한 해당파일이 실행될 때 소유자의권한으로 실행되도록 하는 비트이며 

해당 비트가 설정되면 소유자에대한권한인 rwx 중에 x가 

"rwsr-x---" 와 같이 s로 변경되어 출력됩니다.


4) chattr +i /bin/su


파일은 몇몇개의 속성이 있는데 복사변경삭제 불가 속성인 i를 지금 변경한 파일에 추가합니다.

그래야 타인이나 내가 실수로 해당 명령어에 대한 권한 설정을 변경하는 것을 방지 할 수 있습니다.






3. 내가 사용할 계정을 su명령어의 소유그룹에 추가한다.

모든 그룹에 대한 정보는  /etc/group 라는 파일에 저장이 됩니다.

wheel이라는 리눅스 기본 관리자 그룹은 보통 10번 그룹아이디를 가지고 있으며

그옆에 ,pauli 와 같이 내가 사용할 계정명을 추가하고 저장하면 

변경사항이 적용됩니다.






4. ssh 설정파일의 root접속 제한을 설정한다.

ssh 설정파일의 경로는 /etc/ssh/sshd_config 와 같으며

find / -name sshd_config 를 통해 sshd_config 파일을 찾으면 됩니다.


vi 에디터를 통해 해당파일을 열어보면 

아래쪽에

#PermitRootLogin yes 라는 주석처리된 부분이 있습니다

주석처리 되었지만 yes라고 써있다는 것은 보통 기본값이 yes라는 뜻입니다.





i 를 눌러 'INSERT' 모드로 변경한 후 

아래그림과 같이 저 부분만 no 로 바꾸고 주석을 해제하면 됩니다.




제대로 변경하였으면 :wq 를 입력하고 엔터를 입력해서 저장후 빠져나옵니다.







설정을 변경하고 있는동안에도 sshd 는 계속 실행중이기 때문에 변경사항을 적용하려면

service sshd restart 명령어를 통해 재시작 해줍니다.















5. 변경한 사항들이 잘 적용되었는지 확인




pauli 로 접속하여 su 명령어를 이용해 root 로 로그인 되는 것을 확인





root로 원격 접속이 차단됨을 확인.



'개발 > 서버' 카테고리의 다른 글

Node.js 서버 구축  (0) 2018.04.30


개발환경

서버 OS 

CentOS 7 

접속방식 

원격접속 ( putty [ ssh ] ) 

IDE 

vi editor

 접속 PC OS

Windows 10 


간단한 http 웹서버 구축하는 방법입니다. 

아파치처럼 특정 경로의 정적 파일을 서비스하도록 서버를 구축합니다. 



1. 서버에 원격접속

- 원격접속을 위해 putty를 설치합니다. 


- 원격접속 터미널 프로그램으로 SSH (22번포트) 를 통해 통신하며, 

대부분의 서버 호스팅 업체에서 제공하는 서비스를 이용하기 위해 사용합니다.





https://www.putty.org ( putty 공식 사이트 ) 에 접속 후 다운로드 페이지로 이동합니다.







다운로드 페이지에서 윈도우용 설치 패키지 ( MSI ) 파일이 있습니다. 

32비트 64비트 각각 자신의 컴퓨터에 해당하는 파일을 다운받아 설치하세요.




설치후 위와같이 생긴 putty 아이콘을 더블클릭하여 실행합니다.




- 서버에 접속


해당 서버의 root 계정으로 접속합니다. 



login as: root 

password:  비밀번호 입력 후 엔터( 입력창에는 아무것도 표시되지 않습니다. )

엔터 후 계정정보가 일치하면 [root@localhost ~]# 와 같은 shell 입력창이 나옵니다.


접속을 했으면 먼저 서버환경구축을 위해 node.js 공식 사이트로 이동합니다.


https://nodejs.org/ko/





2. Node.js 설치






윈도우가 아닌 리눅스( CentOS 7 ) 에 설치할 것이기 때문에 다른 운영체제를 클릭합니다.




패키지 관리자를 통해서 설치하면 간편하게 설치가 가능합니다.

따라서 패키지관리자를 통한 Node.js 설치 클릭






CentOS 는 Redhat 계열의 RHEL ( Red Hat Enterprise Linux ) 의 배포판이기 때문에 EnterpriseLinux 를 클릭 








순서를 보면 먼저 

1. node.js 패키지파일 다운로드 ( 여기서는 버전 8.x 사용 - 안정적입니다. )

2. node.js 설치

3. 빌드도구 ( C++ 모듈 등과 같은 네이티브로 만들어진 모듈을 사용할 경우 )


의 순서로 설치를 진행합니다. 3번은 사이트의 설명과 같이 선택사항입니다.







1) 안정화 버전인 node 8.x 환경의 파일을 받습니다.

터미널에 공식사이트에 나온 설치 명령어를 그대로 입력하면 아래와 같이 다운로드 및 설정이 진행됩니다.


curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -





2) node환경을 설치하고 실제 nodejs를 설치합니다.


sudo yum -y install nodejs


명령 입력 후 설치 진행은 아래와 같습니다.




3) 아래는 gcc-c++ 과 make 빌드도구 입니다.

설치할경우 아래와 같이 설치가 진행됩니다.


yum install gcc-c++ make






3. 방화벽 설정.

http 웹서비스는 80번 포트를 사용합니다.

서버의 방화벽이 80번 포트를 닫아놓은 경우 http 웹서비스가 되지 않기 때문에

방화벽 설정을 체크합니다.


firewall-cmd --list-all





위 사진을 보면 dhcpv6-client , ssh 두가지 서비스에 대한 포트만 열려있음을 알 수 있습니다.

거기에 http 서비스를 추가합니다. 방화벽 정책을 수정할 땐,



아래와 같이 public zone에 대해 http 서비스를 영구적으로 추가 시키는 명령어를 작성하고,


firewall-cmd --zone=public --add-service=http --permanent



설정을 변경했으면 아래와 같이 리로드 (재시작) 을 해줘야 합니다.


firewall-cmd --reload


아래 그림을 보시면 list-all 명령의 결과로 변경사항이 적용되었음을 알 수 있습니다.




위 그림처럼 서비스를 오픈하거나 

아래 그림처럼 해당 포트를 직접 명시해도 됩니다.

( 둘다 http 서비스가 기본값으로 80번 포트를 사용하기 때문 )





4. 웹 서버 구현



1) 패키지 초기화 및 모듈 설치


이제 서버를 구동할 디렉터리를 만들고 이동합니다.





mkdir 명령어를 사용하여 디렉토리를 만들고 cd 명령어로 이동하여

/home/pauli/node_projects/httpServerTest 디렉터리로 이동했고,

npm init 명령어를 입력합니다.


npm 은 node package manager 의 약자로 node와 관련된 패키지들을 제어할 때 사용하는 명령어입니다.

npm init을 입력하면 지금 초기화되는 패키지의 이름,버전,설명,시작파일,테스트명령어,깃저장소 주소,키워드,작성자,라이센스등을

입력할수있으며 그냥 엔터를 치면 기본값으로 입력이 됩니다.




초기화 시에 입력한 것들이 package.json 파일에 저장이 되고 이는 변경도 가능합니다.

다음은 서버코드 작성을 편리하게 해줄 수 있는 express를 설치합니다.


npm 패키지의 설치 명령은 

npm install 패키지명 과 같고 뒤에 옵션으로 --save 를 붙일 경우. 

패키지가 설치될 프로젝트에 해당 패키지에 대한 의존성이 자동으로 추가됩니다. 

( package.json에 작성됨 , 버전관련해서 package-lock.json 에 작성됨)



위 그림과 같이 

npm install express --save 를 통해 express 를 설치하고나면 



위 사진처럼 

node_modules : npm으로 설치한 모듈들의 저장경로

package.json : 의존성

package-lcok.json : 버전 의존성 관리


1개의 디렉터리와 2개의 파일이 생성됩니다.




2) 서버 코드 작성

vi index.js 를 입력하여 

해당 프로젝트 폴더에 index.js 파일을 생성하고

아래와 같이 작성합니다.



express 모듈에서 인스턴스를 생성하여 app변수에 넣고 

app.get을 통해 '/' 경로로 요청이 들어올 경우 

'Hello Node.js ~! '라는 응답메세지를 보내도록 설정했습니다.


app.listen을 통해 80번 포트에 응답대기를 하고 

응답대기가 시작되면서 server test on port 80 이라는 로그를 출력하도록 작성했습니다.


해당 파일을 저장하고 종료한 후에

작성한 파일을 실행합니다.




실행명령어 : node 파일명


서버가 80포트에서 실행





위와같이 해당 프로젝트를 작성한 서버의 IP주소 및 도메인을 입력하면 

작성한 서버가 제대로 실행됨을 확인할 수 있습니다.

'개발 > 서버' 카테고리의 다른 글

원격접속보안 - ssh  (1) 2018.04.30

+ Recent posts