본문 바로가기

3. Pwnable (포너블)/2) 개념 정리

[24.03.30] 3주차 활동 - 리눅스 기초

인프런 '생활코딩-리눅스' 강의를 함께 듣고 공부했다.

섹션 6. 사용자

섹션 7. 권한

섹션 8. 그룹

섹션 9.  인터넷, 네트워크 그리고 서버

 

https://inf.run/9Yxy


📌 섹션6. 다중 사용자 시스템

1. 다중 사용자 -1

컴퓨터를 여러명이서 같이 사용할 때 각자의 권한이 필요함(각자의 아이디로 로그인해 컴퓨터 사용)
=> 다중 사용자 시스템 필요

  • 다중 사용자 시스템의 단점
    : 각 사람마다의 권한 체크가 필요함 -> 시스템 복잡도 커짐
    중요한 정보를 저장했는데 권한에 대해 제대로 설정하지 않아 누구에게나 공개될 수 있음

2. 다중 사용자 -2

명령어
id : 자신이 누구인지 알 수 있음(내가 누군지 식별한다)
uid (user id) : 사용자의 아이디
gid (group id) : 그룹의 아이디
who : 현재 이 시스템에 누가 접속했는지 알려줌

3. 관리자와 일반 사용자

1. unix의 두가지 형태의 사용자

super(root) user user
시스템에서 전지전능한 권력 가지고 있는 강력한 사용자 컴퓨터 사용자
super user인지 확인 필요 일반적으로 super user 권한 얻고 싶을 때 -> sudo (기본적으로는 일반 유저임)
   
일반적으로 root라는 이름 가지고 있음  
# : 슈퍼유저 $ : 일반유저

2. su 명령어

su : A 사용자 상태에서 B 사용자가 되고 싶을 때

< su로 super user 되는 법>
su - root -> 비밀번호 -> super user됨
exit -> 다시 일반 유저 되고 싶을 때 로그아웃 되면서 기존 사용자 됨

3. root 사용자 잠금 푸는 법

sudo passwd -u root -> 잠금 풀림
(-u : unlock 약자)
sudo passwd -l root : root 잠금
(-l : lock 약자)

super user 상태에서
pwd입력 -> /root 나옴
=> 최상위 디렉토리 밑에 있는 루트 디렉토리가 root라는 사용자(super user)의 홈 디렉토리이다

일반 사용자의 홈 디렉토리는 cd

로 알 수 있음
(

: 현 사용자의 홈 디렉토리)

4. 사용자의 추가

(duru라는 이름의 사용자를 추가하고 싶을 때)

  1. sudo useradd -m duru
  2. password 입력
  3. 홈 디렉토리로 가서 ls 입력
  4. duru라는 사용자 디렉토리 생성

su passwd duru : duru가 사용할 비밀번호 입력 설정

  1. su - duru
  2. password입력
  3. 로그인 됨

** sudo usermod -a -G sudo duru** : duru가 sudo 사용할 수 있도록 함

📌 섹션 7. 권한

1. 권한, permission

하나의 게시물 누가 볼 수 있는지 결정하는 것 (= 권한을 부여한다.)
< 유닉스 >
사용자가 file, directory에 대해 어떠한 행위할 수 있거나 없게 하는 것
권한 종류 : read, wirte, execute

2. 권한 제어하는 법

(배경)
< 사용자 A >
touch perm.txt 파일 만들기
ls -l perm.txt 파일 상세보기 -> 파일의 소유자(사용자A)확인
echo 'hi' (echo : 파일에 표준출력해줌)
echo 'hi > perm.txt 리다이렉션해서 파일에 출력해줌

< 사용자 B >
-> 사용자 A의 파일 소유자 확인
echo 'hello' > perm.txt
소유자가 아닌 사람이 자기 것이 아닌 파일에 편집 ->permission denied(거절당함)

type : -(일반 파일), d(디렉토리), l(심볼릭 링크 파일) ...
access mode : owner권한. group 권한, other (그룹아닌 불특정 사람에 대한) 권한

r ** : read (읽기)
**w
: write (쓰기)
*x * : execute (실행)

rwx : 읽기, 쓰기, 실행 권한 모두
rw- : 읽고 쓸 수 있지만 실행 권한 없음
-w- : 쓰기 권한만 있고 읽기, 실행 권한 없음
r-x : 읽고 실행 권한 있고 쓰기 권한 없음

3. 권한 변경 방법

chmod (옵션)(모드) (파일)

chmod o-r (파일 이름) : other의 read 권한 없앰
chmod o+r (파일 이름) : other의 read 권한 추가
chmod u+r (파일 이름) : user의 read 권한 추가
chmod u+rw (파일 이름) : user의 read, write 권한 추가

4. 실행의 개념과 권한 설정

실행 액세스 모드 -> 실행 할 것인지 아닌지

예시
nano (파일이름)
-> #!/bin/bash
echo '(내용 추가)'
->편집기 나오기

/bin/bash 프로그램 실행 -> 편집 내용 나오고 실행
-> 파일 실행 하고 싶을 때 실행 권한 필요
chmod u+x 통해 실행권한 부여 -> 실행

cat (파일명) 하면 /bin/bash나옴

** 파일이 현재 사용자에 게 실행 가능한 지 봄 -> 운영체제는 /bin/bash 구동시키면서 파일 전달 -> 결과출력

5. 디렉토리의 권한

파일 : 읽기, 쓰기, 실행 명확
디렉토리 : 불분명

** r** : 디렉토리에 대해 안에 있는 파일, 디렉토리 열람 가능/ 불가능 확인
** w** : 없으면 그 디렉토리 안에 파일 생성, 쓰기, 이름 바꾸기 불가
** x** : 디렉토리에 cd명령 통해 들어갈 수 있는지 없는 지에 대해 확인

** 디렉토리 안에 있는 모든 디렉토리 바꾸고 싶을 때

chmod -R o+w (파일 이름)

-R (recursive) : 재귀적으로 모든 디렉토리 수정

6. chmod 총정리

r : 4
w : 2
x : 1
- : 0

rwxrwxrwx (rwx/rwx/rwx) : 777
rwx/r-x/r-x : 755
r--/---/--- : 400
rw-/r-x/r-- : 654
chmod 333 (파일이름) -> --wx-wx-wx

reference
u : user
g : group
o : other
a : all

operator
/+
/-
/=

chmod a+r (파일이름) : 모든 사용자에 대해 읽기 권한
chmod a=rwx (파일이름) : 모든 사용자에 대해 rwx

** +는 추가하는 것, =은 아예 그걸로 바꾸는 것

📌 섹션 8. group

1. group

파일과 디렉토리를 여러 사용자들이 공동으로 관리할 수 있는 방법

user아니고 (user가 아닌 모든 사용자인) other도 아닌 어떤 특정 사람들의 그룹에게 파일 권한을 주고 싶을 때 group 사용

파일에 그룹 부여 -> rwx 통해 그 그룹에 속하는 사람들에 대해 권한 부여

2. groupadd

< 그룹 만들기 >
useradd -G (그룹 이름) (사용자 이름) : 아직 존재하지 않는 사용자를 그룹에 넣고 싶을 떄

sudo groupadd (그룹이름) : 그룹 추가(일반 사용자는 수정 불가)

sudo usermod -a -G (그룹 이름) (사용자 이름) : (-a는 -G와 함께 다님, 그룹에 사람 추가하는 명령어)

sudo chown (현 디렉토리 소유자):(그룹이름) . : 현 디렉토리의 소유자가 (그룹이름)으로 바뀜 (.은 현 디렉토리)

** (명령어) !! : 앞에 사용한 내용 다시 쓸 때 -> !!

📌 섹션 9 인터넷, 네트워크, 세션

1. 인터넷

1. < 인터넷에 접속하는 방법 >

1 .
domain name 입력
goggle.com => domain name
(전화번호에 저장된 이름)

2 .
ip address (internet protocol)
(전화번호)

(원리)
** DNS(Domain Name System) : 모든 도메인이 어떤 ip인지 저장되어있음
(전화번호부)

DNS 서버에 연결되어서 domain name이름 입력하면 DNS가 ip 찾아서 접속

2. 내 IP 알아내는 방법

1. id addr
-> 결과 내용 중 inet 부분에 있는 ip address가 내 아이피

*2. ipinfo.io *
-> 웹 브라우저에서 ipinfo.io 온라인 서비스에 접속하며 나옴

=> cmd에서
curl google.com (구글닷컴 접속해서)
curl ipinfo.io/ip (ip주소 cmd로 확인)
입력하면 ip 확인가능

ip addr과 curl로 검색한 ip주소가 다를 수 있음
id address : 컴퓨터에 부여된 실제 ip
curl : 온라인 서비스 입장에서 접속한 것의 결과적인 ip가 무엇인지 나옴

대부분 다르지만 
같다면 컴퓨터의 실제 ip와 외부 접속 시 사용하는 ip가 같은 것임

3. router

집에서 컴퓨터 쓸 때 통신사와 연결됨
통신사는 각 기기마다 ip를 부여함

컴퓨터들이 router(공유기)를 이용해 통신사와 하나로 연결됨

router ip 기기들의 ip
router가 통신사의 ip를 부여받음 사설아이피
public address private address
대표번호 내선번호

router로 연결된 기기들은 server가 될 수 없음 (client는 가능)
=>외부 컴퓨터가 접속할 순 없지만 같은 공유기로 연결되어있는 컴퓨터들끼리만 접속 가능

2. apache

(배경)

  • 웹브라우저가 웹서버에게 정보 요청request
  • 웹 서버는 항상 켜져있다가 요청 들어오면 분석
  • 웹 서버의 하드디스크, ssd 같은 곳에서 요청 들어온 파일 읽어서 가져온 다음 웹브라우저에게 response 해줌

웹 브라우저 : firefox, chrome ...
웹 서버 : apache, nginx, IIs ...

1. apache 설치해보기

많은 웹 서버들 중 apache를 설치해보았다.

sudo apt-get update; (무언가를 설치할 떄는 항상 업데이트 먼저 하기)
sudo apt-get apache2 (apache 설치)

sudo service apache2 start : 켜짐
sudo service apache2 stop : 꺼짐
sudo service apache2 restart : 껐다 켤 때

sudo htop : 여러 프로그램을 화면에 표시해줌 -> apache 잘 켜졌나 확인하는 방법


웹 서버에는 많은 접속 들어올 수 있음
접속 많아지면 분산처리를 위해 자동으로 새로운 apache프로세스 켜지고, 적어지면 없어진다.

sudo apt-get install elinks : elinks 설치
(elinks : url 치면 쉘 환경에서 웹 브라우징할 수 있음)

elinks http://(내 ip주소)/ : 자신의 웹브라우저 접속


local host : 웹 브라우저가 설치되어 있는 서버 컴퓨터에 존재하는 웹 서버에 접속
127.0.0.1 : 자기 자신 가리키는 고정적 ip, 컴퓨터 자체의 아이피

local host, 127.0.0.1 서로 같은 의미이다.
따라서 해당 웹브라우저가 설치되어있는 컴퓨터의 웹 서버에 접속할 떄 local host, 127.0.0.1 이용해서 접속 가능


프로그램 동작 방법에 대한 설명 : cd /etc

웹서버는 사용자가 요청한 파일을 어디서 읽어 오는 것일까?

  1. cd apache2/
  2. ls -l => apache2.conf 파일 나옴
  3. sites enabled라는 파일 들어가보면 => 000-default.conf 파일
  4. nano 000-default.conf => /var/www/html
  5. 들어가 ls -l 하면 index.html파일 나옴
  6. 그 파일 이름을 sudo 이용해 다르게 바꾼 뒤
  7. sudo nano index.html => 문서 편집. 내용 쓰기
    (바로 elinks http://127.0.0.1/index.html => 에러)
  8. elinks http://127.0.0.1/index.html
    => 편집한 글 나옴, 일반적인 웹브라우저에 접속해도 그대로 잘 나옴

/etc/apache2 디렉토리에 있는 여러가지 설정 파일 이용해서
사용자의 접속이 들어왔을 때
server 컴퓨터의 저장소에서 사용자가 요청한 파일 어디서 찾을 것인가를 도와줌
그곳에 있는 파일 찾아 읽어서 웹 브라우저에 보내줌

실제 서버, 프로그램 운영 시 설정 어떻게 하느냐에 따라 프로그램 동작 바꿀 수 있음

웹 서버가 사용자가 요청한 파일을 찾는 설정에서 지정된 /var/www/html 디렉토리는 설정 바꾸면 언제든지 이동 가능

document root : 웹 브라우저에서 사용자가 요청한 웹 페이지 찾는 최상위 디렉토리

3. log

apache 웹 서버가 동작할 때 잘 되고 있는지 아닌지 확인하고 싶을 때
*access.log // err.log *
파일에 기록됨

cd /var/log/apache2/
tail /var/log/apahe2/access.log
: 파일 끝에 있는 내용만 추가
tail -f /var/log/apache2/access.log : 실시간으로 추가되는 끝 정보만 출력 (접속 현황 알고 싶을 때 log를 찾아본다)

error.log 붙이면 특정 에러 발생 시 이 파일 열어 문제가 무엇인지 알 수 있음

4. ssh

자신 컴퓨터 이용해 sever 컴퓨터 원격제어할 때 사용

sever에 ssh server 설치
자신 컴퓨터에 ssh client 설치

=> server 컴퓨터에 실행, 동작 결과를 ssh server에 전달하고 그 서버는 client에 보내 ssh client 화면에 보여짐

1. ssh 서버 설치하는 법

sudo apt-get install openssh-server openssh-client

*sudo service ssh start
sudo ps aux | grep ssh *

=> 잘 설치되었나 확인 (sshd 나오면 잘 설치됨)

ssh (접속하고자 한 아이디)@(접속하고자 하는 컴퓨터 ip) : 원격 제어 통해 타 컴퓨터에 접속

5. port

1. port

(ssh -p(포트숫자) (위에 있는 접속 방식)
웹 브라우저에서는** :(포트번호)**

(포트 숫자는 생략해도 가능 )

모든 컴퓨터에는 port 있음
0번 구멍부터 65000개 구멍

client의 웹브라우저는 웹 서버의 80번 포트 찾아감
(웹 서버가 80번 포트와 연결되어 있기 때문)
80포트번호에서 대기하고 있던(listen) 서버가 동작하기로 약속했던 대로 동작해서 웹브라우저에 돌려줌

특정 포트번호 
웹 : 80
ssh : 22

네트워크에서 1024 포트까지는 well-known port
포트값 고정해서 접속할 떄 포트 안써도 됨

  • 컴퓨터 원격제어는 위험하기 때문에 잘 안쓰는 포트번호로 바꿔서 표현O
    웹 서버 포트번호 바꿔서 웹 서버에 접속 가능

2. port forwarding

3. default gateway

default gateway : 공유기 내부에서만 사용되는 ip

< 알아내는 법 >

    • 브라우저에 ip route 입력해서 검색
    •  

게이트웨이 관리자 화면

  •  
  • 관리도구 -> 환경설정 -> 고급설정
  • nat 라우터 관리 -> 포트포워드 설정
  • 서버 설치하고 싶은 컴퓨터의 내부 ip입력
  • 규칙이름 입력
  • 외부포트 입력 (사용자가 사용할 포트번호, router쪽 prot)
  • 내부포트 입력 (컴퓨터에 설치되어있는 웹 서버가 몇번째 포트에서 리스닝 하고 있는지 )
  • 추가버튼 누르고 완료

(외부포트)로 사용자가 들어왔을 때 (내부 ip)에 해당되는 컴퓨터의 (내부포트)로 신호 보낸다.

(router ip 알아내는 법)
curl http://ipinfo.io/ip
이 주소 웹 브라우저에 사용자가 ip 입력해 포트번호 쓰면 > 내용 나옴