[권한 : permission]
- 권한 기본
- 유닉스 계열 시스템에서 '권한'을 통해 '제어가 가능한 대상'은 파일과 디렉토리이다.
- 이 대상에 관련된 읽기, 쓰기, 실행 권한을 제어한다.
- echo 'hello' > permission.txt
- 이 파일에 입력하는 명령어. 하지만 권한이 없는 사용자가 접근해서 작성할 경우 permission denied 된다.
- -rw-rw-r-- 1 hoho hoho 0 Dec 4 23:11 permission.txt
- 맨앞에 -는 파일을 의미. 디렉토리일땐 d가 기록된다.
- rw- rw- r--
- Access mode. 접근 권한
- 소유자 권한/그룹 권한/모든 사용자 권한
- r = read, w : write, x : execute
- hoho 소유자 owner
- hoho 그룹
- 권한을 변경하는 방법 : chmod
- chmod o-r permission.txt : permission.txt파일의 other 읽기 권한을 제거한다.
- chmod o+r permission.txt : 모든 사용자에게 permission.txt의 읽기 권한을 부여한다.
- chmod u-r permission.txt : 소유자에게 읽기 권한을 제거한다.(이런식으로도 설정 가능하다.)
- 실행의 개념과 권한 설정 : execute
- 실행 액세스 모드는 어떤 파일에 대해서 실행 가능한 파일로 할 것인지 설정하는 것이 실행권한이다.
- hoho-machine.sh 생성
- /bin/bash 프로그램을 사용해서 이 명령어를 수행하라는 내용이다.
#!/bin/bash
echo 'ho ho ho ho '
- 특정 프로그램을 통해서 프로그래밍 언어를 실행하는 것은 제약이 없지만 실행 파일을 사용해서 프로그램을 구동시키고 싶다면 권한이 필요하다.
- chmod u+x hoho-machine.sh : 소유자에게 이 파일에 대한 실행 권한을 준다.
- 쉘 파일을 실행시켰을 때 운영체제는 제일 먼저 현재 사용자에게 실행 가능한지 확인한다.
- chmod o+x hoho-machine.sh : 다른 사용자들이 실행가능하도록 권한을 준다.
- directory의 권한
- 파일은 읽기/쓰기/실행이 명확하지만, 디렉토리는 명확하지 않다.
- mkdir perm; cd perm; echo 'hi' > perm.txt
- 디렉토리 생성하고 그 디렉토리안에 텍스트 파일을 생성했다.
- chmod o-r perm : other의 디렉토리의 읽기 권한 제거
- chmod o+r perm : other의 디렉토리의 읽기 권한 부여
- 디렉토리의 r 권한은 그 디렉토리에 있는 파일들을 조회할 수 있는 권한이다.
- 디렉토리의 w 권한이 없다면 그 디렉토리 하위에 파일을 생성/삭제/변경을 할 수 없다.
- x 권한은 cd를 통해 디렉토리에 들어갈 수 있는지를 의미한다.
- 특정 디렉토리 하위의 모든 디렉토리의 권한을 변경하고 싶을 땐 R (recursive 옵션)을 사용한다.
- chmod -R o+w perm
- perm 디렉토리에 other애개 w권한을 주는데 하위 디렉토리들의 권한까지 함께 줘라.
- chmod 사용법 정리 - class & operation
- Octal modes : 8진수를 사용해서 권한을 표현할 수 있다.
read,write,execute | rwx | 7 |
read,write | rw- | 6 |
read,execute | r-x | 5 |
read only | r-- | 4 |
rite and execute | -wx | 3 |
write only | -w- | 2 |
execute only | --x | 1 |
none | --- | 0 |
- chmod 111 perm.txt
- 이 파일에 대한 권한을 소유자, 그룹, other 모두 실행권한만 부여한다.
- 다른 방식
u | owner | 파일 소유자 |
g | group | 그룹에 속하는 사용자 |
o | others | 위를 제외한 모든 사용자 |
a | all | 모든 사용자 |
- 연산자
+ | 권한 부여 |
- | 권한 제거 |
= | 특정 클래스에 해당하는 권한을 기재 |
- chomod a=r perm.txt
- 모든 사용자에게 읽기 권한만 부여
[그룹]
- 파일과 디렉토리를 여러 사용자들이 공동으로 관리할 수 있는 방법 - group
- 특정한 사용자들에게 권한을 부여하고 싶을 때 그룹으로 묶는다.
- 그리고 파일에 대한 그룹권한을 설정해서 한꺼번에 설정할 수 있다.
- groupadd
- sudo mkdir /var/developer
- 개발자들이 공용으로 사용할 프로그램들을 넣을 디렉토리를 생성
- groupadd developer
- 일반사용자는 실행할 수 없는 명령어.
- sudo !!
- 느낌표 두개는 직전에 사용한 명령어를 호출하는 것이다.
- nano /etc/group
- 그룹에 대한 정보를 가지고 있는 파일을 조회해서 반영 여부를 확인 할수있다.
- sudo usermode -a -G developer [사용자명]
- usermode는 이미 존재하는 사용자의 설정을 변경하는 명령어. 그룹에 사용자를 추가한다는 옵션을 추가한 것이다.
- sudo chown root:developer .
- 현재 디렉토리의 소유자를 root에서 developer 그룹으로 변경.
[인터넷,네트워크,서버]
- 인터넷
- 인터넷, 네트워크, 서버에 대한 기본 개념을 이해해보자.
- 인터넷이 돌아가는 원리는 클라이언트가 웹 브라우저를 통해 서버에 요청을 보내고 웹 페이지를 응답을 받아서 렌더링한다.
- 두가지 주소 체계 (도메인명과 ip 주소)
- google.com , naver.com 은 domain name 이다.
- 서버에 접속할 때 이런 도메인 네임 말고 ip주소(172.217.25.78)를 이용해서도 접속할 수 있다.
- 도메인 이름으로 어떻게 ip 주소를 찾아가는 것일까 ? 정답은 DNS Server 덕분이다.
- DNS가 요청으로 전달받은 도메인명을 ip주소로 반환해서 알려준다.
- 자신의 ip 주소를 알아내는 방법
- ip addr : inet 뒤에 ip 주소를 확인할 수 있다. 이 컴퓨터에 부여된 ip
- https://ipinfo.io/ip 로 접속하면 브라우저에 접속한 ip주소가 조회된다.
- curl ipinfo.io/ip 로 쉘에 실행하면 브라우저가 조회된다. 온라인 서버로 접속된 ip를 결과적으로 확인하는 것이므로 ip addr과 같을수도 다를수도 있다.
- 다른 경우는 왜 일까 ?
- 통신사는 컴퓨터 회선에 ip를 부여한다. 각 디바이스마다 회선을 만들면 ip가 각기 부여되고 요금이 비싸다. 그래서 공유기를 두고 router를 통해서 여러대의 컴퓨터를 사용할 수 있는 것이다. 통신사가 부여한 ip는 router가 갖는다. 사설 ip라는 개념이 여기서 등장한다.
- public address : 통신사가 부여한 ip. curl 로 조회한 ip. 둘이 동일한 경우는 라우터를 사용하지 않음
- private addrsee : 사설 ip. 외부에서 모름. 'ip addr' 명령어를 통해 조회.
- apache 웹서버 웹 서버를 리눅스에 설치하는 방법을 알아보자
- intro
- 클라이언트는 request, 서버는 response
- 브라우저를 통해 웹 페이지를 클라이언트에서 요청
- 서버는 요청을 받아 이를 파악해서 필요한 데이터를 조회해서 응답한다.
- 웹 브라우저에 해당되는 프로그램으로 firefox, ie, chrome을 설치해서 사용하는 것 처럼, 웹 서버도 설치해서 사용하면 된다. 예) apache, nginx , IIS 등
- install
- sudo apt-get install apache2 : 패키지 설치
- sudo apt-cache search apache : 정확한 패키지명을 모를 때 검색.
- sudo service apache2 start : 웹 서버 키기
- sudo service apache2 stop : 웹 서버 끄기
- sudo htop : 아파치가 제대로 켜졌는지 프로세스 리스트 확인
- 웹 서버는 많은 접속이 들어올 수 있으므로 분산해서 처리해야 한다. 그래서 여러개의 프로세스가 생성된다.
- 쉘에서 웹브라우징을 수 있는 프로그램 : elinks
- sudo apt-get install elinks 설치
- elinks http://[웹서버를 킨 자신의 ip]/
- 127.0.0.1 자기 자신을 의미하는 주소. localhost
- configuration
- 대부분 서버는 etc 디렉토리 하위에 자신들의 이름의 경로가 존재하고 환경설정 파일 또한 존재한다.
- /etc/apache2
- 여러가지 프로그램의 설정파일이 저장된 디렉토리 /etc
- /sites-enabled/apache2.conf 파일을 통해 환경설정 진행.
- 웹 페이지를 찾는 최상위 디렉토리 DocumentRoot
- log
- /var/log/apache2/
- 이 디렉토리안에 access.log, error.log 파일이 존재한다.
- follow하면서 추가되는 로그들을 출력하도록 실행 : tail -f /var/log/apache2/access.log
- 서버 프로그램이 동작을 확인하고 싶다면 로그를 확인하자
- error.log는 무슨 문제가 있는지 파악하는 용도로 사용한다.
- 원격제어 ssh
- 웹서버를 사용하지 않을 순 있어도 ssh를 사용하지 않는 경우는 몹시 드물다.
- 데스크탑 대용으로 리눅스를 일반적인 가정에서 사용하지 않는다.
- 리눅스는 서버시장에서 압도적 다수를 차지하고 있다.
- 아주 작은 사물들의 IoT를 제어할 때, 그 내부에 설치된 운영체제는 거의 모두 리눅스이다.
- 클라이언트는 서버 컴퓨터를 원격 제어하는 경우가 있는데 이때 SSH 원격제어를 사용한다.
- 유닉스 계열에 운영체제가 깔린 컴퓨터를 쉘을 통해 원격제어를 하고자할때 사용하는 게 SSH이다.
- SSH Client, SSH Server가 설치되어 있어야한다.
- 오늘날 대부분의 유닉스 계열 컴퓨터에서는 SSH가 기본적으로 설치되어있다.
- sudo apt-get purge openssh-server openssh-client
- remove가 아닌 purge를 하게되면 환경설정 관련한 파일까지 모두 삭제된다.
- sudo apt-get instatll openssh-server openssh-client
- 현재 서버에 openssh-server와 openssh-client를 설치 (구체적인 서버명인 개념 - openssh-server )
- sudo service ssh start
- sudo ps aux | grep ssh 현재 프로세스중에 ssh와 관련된 프로세스 조회
- ssh라는 명령어는 openssh-client를 실행하는 명령어
- ssh 사용자명@ip주소
- 포트 port
- 포트란 무엇인가?
- ssh -p 22 사용자명@ip주소
- ssh방식은 22번 포트를 사용한다.
- default 포트번호는 웹은 80, ssh 22이다.
- 포트는 구멍과 같은 개념이다. 0~6만5천여개가 존재한다.
- 0~1024는 well known 포트로 마치 표준처럼 사용한다.
- 포트포워딩
- Internet Service Provider(ISP)가 부여한 ip가 라우터에 부여되고 그 라우터(공유기)를 통해서 디바이스들은 인터넷을 연결한다.
- 라우터에 부여된 ip는 public ip, 내부망에서 부여된 ip는 private ip로 외부에서 접근이 불가능하다.
- 라우터에 존재하는 포트 활용해서, 클라이언트의 접속이 들어왔을때 특정 서버로 연결을 하는 것을 의미한다.
- 공유기의 환경설정 방법은 기기마다 모두 다르니 사용설명서를 보고 진행하면 된다.
- 공유기의 안쪽에서만 통용되는 공유기의 ip를 default gateway라 한다
- ip route 명령어를 실행해서 조회된 공유기의 ip주소를 웹 브라우저에 치면 공유기 관리도구 화면으로 넘어간다.
- 외부포트는 라우터로 클라이언트의 요청을 받을 포트번호를 의미한다.
- 내부포트는 망 안에 있는 private ip의 LISTEN상태의 포트번호를 의미한다.
- 포트포워딩을 통해 많은 자유도를 누릴 수 있다.
[도메인 : domain]
- 도메인 기본 개념
- DNS = Domain Name System
- DNS가 있기전에는 host가 존재했다. 인터넷을 사용하는 컴퓨터마다 hosts file을 가지고 있었다. 이 파일에 등록되어 있는 ip주소를 가지고 접속을 했던 시절이 존재했다.
- elinks http://localhost/
- 이 명령어를 실행하게 되면 현재 로컬컴퓨터로 연결된다. 다른 도메인으로 변경하길 원한다면 hosts file을 수정하면 된다.
- hosts 파일
- 호스트 파일을 통해서 도메인명을 마음대로 변동시킬 수 있다.
- sudo nano /etc/hosts
- 127.0.0.1 google.com
- 추가로 위에 내용을 작성해주면 더 이상 구글사이트가 연결되는 것이 아니라 hosts파일에 등록되어있는 ip주소로 연결된다.
- host들이 묶여있는 것을 네트워크. 네트워크 집단들이 모여있는 것이 인터넷을 의미한다.
- /etc/hosts를 어떻게 이용할 수 있을까?
- 개발환경에서만 hosts파일에서 도메인을 자신의 테스트 pc로 변경해두는 경우가 있다. (상용서버를 바로 변경하면 위험하기 때문이다)
- 그래서 해커들의 목표가 되기도 한다. (사용자들의 개인정보를 이용해서 악의적인 변조를 하는 경우)
- 도메인 구입
- /etc/resolv.conf를 조회하면 nameserver를 확인할 수 있다.
- 도메인을 사용가능한지 조회하고, 마음에 드는 도메인을 선택 & 구매해서 ip주소를 등록하면 된다.
- host 도메인명
- 명령어 실행시 도메인명과 매칭되는 ip주소를 확인할 수 있다.
- 서브 도메인
- 여러대의 서버가 있을 경우 각 각의 서버에 다른 도메인을 얻으면 도메인 마다 금액을 지불해야한다.
- 그래서 서브 도메인을 얻는 방식이 있다.
- DNS 동작 원리
- dig +trace [도메인]
- 클라이언트는 root DNS list를 이미 알고있다. 여기에 정보를 요청하는 것이다.
- 각 도메인마다 담당하는 DNS 목록이 있고, 검색한 도메인에 해당하는 ip 주소를 알 때까지 반복해서 찾는다.
- 도메인을 구매할 경우 DNS를 관장하는 기관에 관리비를 내는 개념으로 생각하면 된다.
- DNS 서버를 직접 구축하는 방법도 있지만 사업자들이 제공하는 서비스를 이용하는 방법을 많이 사용한다.
[인터넷을 이용 서버간 동기화 rsync]
- rsync
- sync는 동기화를 의미한다. (기준값이 있으므로 방향성이 존재한다)
- remote. 즉, 원격을 통해 서로 독립된 곳에 있는 서버끼리 네트워크를 통해서 sync를 진행한다.
- touch ./src/test{1..2}
- 파일을 test1~10까지 생성한다.
- rsync -a src dest
- dest안에 src를 모두 카피한다. (싱크를 맞춘다.)
- rsync -a src/ dest
- src밑에 있는 파일을 dest디렉토리에 싱크를 맞춘다.
- v 옵션을 추가하면 상세 내역을 조회할 수 있다
- 변동이 있을 경우만 동작하므로 매우 효율적이다.
- a 옵션은 아카이브 모드로 동작한다는 의미이다.
- Remote sync(네트워크를 통해 동기화시키는 방법)
- rsync -azP [전송할 디렉토리] [사용자명]@[ip주소]:[전송받을 디렉토리]
- 백업할때 거의 필수적으로 유용하게 사용한다.
[로그인 없이 로그인하기 : ssh key]
- ssh public private key
- ssh 공개키, 비공개키를 만든다.
- ssh-keygen 명령어 실행 시 랜덤으로 생성된 암호화키를 만들 수 있다.
- id_rsa 개인키.
- id_rsa.pub 공개키.
- ssh-copy-id 사용자명@ip주소
- 로그인 하고자하는 컴퓨터에 authorized-keys에 공개키를 추가로 붙여준다. 이를 통해 로그인 인증이 필요없이 접속이 허용된다.
- rsync
- 기본적으로 ssh로 통신을 하기 때문에 공개키를 등록해둔다면
- cron과 같은 자동화를 이용 가능하다. 백업과 같은 용도로 사용하면 매우 편리하다.
- RSA
- 암호화된 상태를 원래 상태로 돌리는 것을 복호화라 한다.
- key를 이용해서 암호화 / key를 이용해서 복호화
- 암호화 & 복호화할때 공통적인 key를 사용하는 경우는 대칭키 방식이다.
- 다른 키를 이용할때는 비대칭키 방식이다.
- 공개키(대칭키) 중 대표적인 기법이 RSA 기법이다.
'CS > OS' 카테고리의 다른 글
[OS] 윈도우 부팅 디스크 버전 확인하기 (0) | 2020.03.07 |
---|---|
[OS] 운영체제 기초 (0) | 2020.02.29 |
[Linux] 생활코딩 리눅스 강좌 (4) (0) | 2019.10.07 |
[Linux] 자주 사용하는 명령어 정리2 (0) | 2019.10.05 |
[Linux] 자주 사용하는 명령어 정리1 (0) | 2019.09.28 |