리눅스의 시작 -> 리누스 토발쯔(핀란드)
Unix 기업용(가상화 진골) -> Multi user, Multi tasking
리눅스의 커널 0.1 -> 0.2 인터넷에 공개
Architecture of Linux OS
Application -> Shell -> Kernel -> Hardware
Application: httpd, sshd, ftp 등
OS에서 사용하는 애플리케이션, 툴, 서비스 등은 커널의 허락이 있어야 물리 자원에 접근이 가능하고 해당 서비스를 실행, 중지시킬 수 있다.
https://kernel.org/
리눅스의 커널이 공개되어있음
uname -a
-> 현재 커널 버전 확인
새로운 커널 다운로드, 컴파일, 설치할 수 있음
x86 -> 일반적인 범용 CPU(인텔, AMD)
엄밀한 의미에서의 리눅스: kernel
보편적인 의미에서의 리눅스: 배포판 리눅스
데비안
-> Ubuntu(컨테이너/k8s)
Red Hat
-> RHEL(Redhat Enterprise Linux, 기업용, 패치/기술지원/업데이트 등에 대한 비용을 과금)
-> CentOS(클라우드/관리 IaC)
https://upload.wikimedia.org/wikipedia/commons/1/1b/Linux_Distribution_Timeline.svg
클라우드에서의 리눅스
초기 DC(Data Center) -> Unix 사용 -> 고가의 서버 장비가 필요하고, x86은 외면 받음 -> Intel/AMD에서 cpu 가상화를 개발함 -> VMware 1.0이 출시하고서, UNIX를 대체하기 시작함 -> 하이퍼바이저 위에 여러 VM을 사용할 수 있음
https://www.redhat.com/ko/topics/virtualization/kvm-vs-vmware-comparison
클라우드 환경을 위한 다양한 도구들은 독립적으로 동작해서는 큰 효과를 볼 수 없다. 다른 도구들과의 연계를 통해 효과를 극대화할 수 있다. 이를 위해서는 서로 간의 호환 문제가 해결되어야 하는데, 이를 리눅스 상에서 해결할 수 있다.
배포판 리눅스는 모두 다른가? -> 대부분 비슷하나 파일 시스템의 구조는 다르다.
ONOS -> 클라우드 및 5G 환경에서의 SDN(Software Defined Network)를 위한 리눅스
Kali Linux -> 데비안 계열의 모의 침투 테스트를 위한 리눅스
대부분의 리눅스에서는 현재 bash와 같은 쉘을 사용하고 있으므로 명령어는 큰 틀에서 비슷하다.
cat /etc/passwd
-> 여러 사용자들이 있다
/etc/passwd는 현재 시스템 내에 있는 사용자들의 정보를 출력해준다.
root, user1은 일반적인 사용자를 의미한다.
apache는 일반적인 사용자가 아니라 웹서비스를 실행할 수 있는 서비스라고 생각해야 한다. 로그인할 수 있는 계정은 아니다.
사용자 --> systemctl restart httpd --> apache --> 웹서비스 재실행
cat /etc/passwd | grep root
"root" -> 계정 이름(ID)
"x" -> 패스워드는 passwd 파일에 기록되지 않는다. 패스워드는 etc/shadow 파일에 저장된다.
"0" -> user의 ID 번호, root는 superuser이므로 0이다.
"0" -> 해당 사용자가 소속되어있는 그룹의 번호(GID)
-> 리눅스의 모든 사용자들은 무조건 하나의 그룹(Primary Group)에 포함되어야 한다. 처음 사용자를 생성하면 사용자 이름과 동일한 그룹이 만들어진다. 그리고 해당 사용자는 자신 이름의 그룹에 자동으로 포함된다.
"root" -> 계정의 이름(full name)
"/root" -> 홈 디렉토리
"/bin/bash" -> 해당 사용자가 사용하는 shell. 최근에는 리눅스에서 기본적으로 bash를 사용하는 경우가 많다. ubuntu의 경우에는 dash를 사용하나, 인증 과정에서는 bash를 사용한다.
cat /etc/passwd | grep user1
"1000" -> user1는 일반 사용자이므로 1000부터 시작
groups root
-> root가 어느 그룹에 속해있는지 보여준다.
groups user1
-> 두 개의 그룹에 포함되어있다.
-> 하나의 계정은 여러 계정에 동시에 포함될 수 있다.
-> primary group은 벗어날 수 없고, 본인의 이름과 동일하다.
파란색 -> 디렉토리
ls -a: 숨김 파일/디렉토리
ls -l: 상세 정보 출력
-: 일반 파일
d: 디렉토리
l: 링크가 걸려있는 파일(soft link(심볼릭), hard link)
owner, group, others
"r": read
"w": write
"x": excute
https://remy.parkland.edu/~smauney/csc128/permissions_and_links.html
빈 파일 만들기. 실제 목적은 시간을 갱신하기 위한 것이나 주로 빈 파일을 만드는 용도로 사용된다.
touch test.txt
vi(m): 화면 단위 편집기
vi를 사용하면 방향키, 키패드 등의 사용에서 불편함이 많다. vim 사용을 추천한다.
vim을 vi 명령어로 실행시키기 설정
vim .bashrc
-> .bashrc 열기
alias vi='vim'
-> 한 줄 추가
.bashrc는 사용자가 처음 부팅할 때 읽어들이는 파일이며 주로 환경 정보 적용이나 alias 등을 현재 적용하고자 하는 것을 미리 입력해 두면 편리하다. 오타가 있을 경우 정상 로그인이 되지 않을 수 있으므로 조심해야한다.
변경된 .bashrc를 현재 환경에 다시 적용하고자 한다면
1) su 를 이용하여 재 로그인한다.
2) source .bashrc -> 현재 환경에 .bashrc를 적용시키겠다.
여러 줄이 들어간 새로운 파일을 만들 수 있다
cat < test.txt
test.txt 파일의 내용을 입력받아 쉘에 출력
cat < test.txt > test2.txt
test.txt 파일의 내용을 입력받아 test2.txt에 저장
cat << EOF > test.txt
한 줄 씩 입력 받아
EOF가 나오면 test.txt에 저장
cat anaconda-ks.cfg
more anaconda-ks.cfg
enter -> 한 줄 씩 내려간다
space bar -> 한 페이지 씩 내려간다
b 키 -> 거꾸로 돌아간다
q 키 -> 빠져나간다
less anaconda-ks.cfg
more와 동일하며 추가적으로 방향키 사용이 가능하다
상위 10줄
head naverheader.html
상위 3줄
head -3 naverheader.html
tail 명령어도 마찬가지
파일 복사
cp ~/anaconda-ks.cfg .
상위 디렉토리에 있는 anaconda-ks.cfg 파일을 현재 디렉토리(.)로 복사
cp -r ../Downloads/ .
-r: 디렉토리 복사
파일/디렉토리 이동, 이름 변경
디렉토리 삭제
파일 삭제
rm -f: 물어보지 않고(프롬프트 띄우지 않고) 즉시 삭제
rm -r: 디렉토리 또는 파일 삭제
rm -rf: 물어보지 않고 즉시 디렉토리 또는 파일 삭제 -> 자주 사용하지만 조심해야 함. 복구 쉽지 않음
d/e/를 한 방에 만들고 싶을 때
mkdir d/e
-> 안 된다
mkdir -p d/e
-> parent인 d를 먼저 만들고, 그 안에 폴더 e를 만든다
history
입력했던 명령어 볼 수 있음
yum -y install wget curl
-> wget, curl 설치
wget: 특정 웹주소로부터 파일 등을 다운로드하기 위한 툴
https://www.rpmfind.net
원하는 app 검색 -> 맞는 버전의 링크 복사
wget https://www.rpmfind.net/linux/centos/7.9.2009/os/x86_64/Packages/gedit-3.28.1-3.el7.x86_64.rpm
curl: 웹사이트 주소를 통하여 해당 페이지의 코드를 다운로드하거나 api 연결, 파일 다운로드 등에 활용된다.
curl localhost
curl http://localhost
curl http://www.naver.com
-> 특정 웹사이트에 접속이 가능한지 불가능한지 판단할 수 있음
-> 302 에러가 나옴
curl -L http://www.naver.com
-L: 포트포워딩(http(80)로 접속한다면 https(443)로 리다이렉트)이 되어있다면 해당 페이지까지 들어가서 코드의 내용을 확인한 뒤 화면에 출력시켜준다.
curl -L http://www.naver.com -o naverindex.html
-> -o: 내용을 파일로 저장
curl을 이용하여 페이지의 헤더 내용을 포함하여 확인하고 싶다면??
curl -i http://www.test.com
curl -O http://www.test.com/test.zip
-> -O: 파일 다운로드
-> wget과 같은 기능
curl -x proxy서버주소:포트번호 http://www.test.com
-> -x: 프록시 서버를 통해 접속
https://docs.oracle.com/cd/E19146-01/821-1828/ghquv/index.html
https://continuetochallenge.tistory.com/66
namespace -> 별도의 독립적인 작업 공간을 가질 수 있다
cgroup -> 각각의 별도의 작업 공간에 별도의 리소스를 적용시킬 수 있다.
0: 종료모드 -> init 0, poweroff, shutdown -P now
1: 복구모드 -> 시스템 관리를 위한 목적으로 활용(네트워크, 다중접속 불가)
2: 네트워크를 지원하지 않는 multi-user
3: 네트워크가 지원되는 multi-user, 일반적인 CLI 부팅
5: 네트워크가 지원되는 multi-user, 그래픽 환경으로의 부팅
6: 재부팅: init 6, reboot, shudown -r now, shutdown -r 22:00
shutdown -c(예약된 종료, 재부팅을 취소)
shutdown -k + 15 현재시간으로부터 15분 후에 종료된다는 것을 접속된 사용자들에게 알려주지만 실제로 종료가 되지는 않는다.
런레벨 조정하기
vi /etc/inittab
systemctl set-default multi-user.target
-> runlevel 3(CLI)으로 변경되었음
-> init 6으로 재부팅
startx
-> GUI로 일시적으로 전환됨
systemctl set-default graphical.target
vi /etc/motd
ip addr list
ip addr show
ip route
-> 라우팅 테이블 출력
-> gw 확인할 수 있음
-> gw: 211.183.3.2
netstat -nr
-> 라우팅 테이블
cat << EOF >> /etc/hosts
> 211.183.3.201 centos7
> 211.183.3.111 centos8
> EOF
cat /etc/hosts
ping centos7
ping centos8
nslookup
> server
> www.naver.com
-> cname으로 보인다
-> type A로 보인다
일반적으로 도메인에 대한 IP 정보는 TYPE A로 보인다.
ex) www.test.com A 1.1.1.1
여러 서버가 하나의 도메인을 활용하는 경우에는 CNAME을 사용하여 구성한다.
https://www.techtarget.com/searchwindowsserver/definition/canonical-name
인터페이스 비활성화/활성화
활성화 될때는 인터페이스의 구성 파일을 읽고 실행된다. 따라서 IP주소등을 변경했을 때에는 systemctl restart network 를 이용하거나 특정 인터페이스를 down > up 하여 활성화 하면 변경된 사항을 적용시킬 수 있다.
ifdown ens32
ifup ens32
ssh -> 서버에 대한 인증, 사용자에 대한 인증(key-pair, password)
[centos7]
systemctl status sshd
-> 켜져있는 것 확인
ls /etc/ssh/
ssh_config -> client의 설정
sshd_config -> host의 설정
vi /etc/ssh/sshd_config
ListenAddress -> 나에게 접속 가능한 주소
PermitRootLogin yes -> 누군가가 root로 로그인할 수 있음 -> 보안 상 좋은게 아님
MaxSessions -> 한 번에 접속할 수 있는 사용자 수
PubkeyAuthenticaiton -> 퍼블릭키 인증 -> 주석 처리되어 있어 꺼져있음
PasswordAuthentication yes -> 비밀번호 인증 -> 보안 상 나쁨
비밀번호 인증 -> 보안 상 나쁨 -> PubkeyAuthentication의 주석을 해제해서 켜기
systemctl restart sshd
-> config 반영시키기
서비스 실행 시 오류가 발생한다면?
-> systemctl status sshd 로 확인
[centos8]
ssh -l root centos7
known hosts 추가 -> yes
ls .ssh/
centos8에 .ssh라는 디렉토리가 생겼음
그 안에 knownhost라는 파일이 생겼음
다시 ssh -l root centos7 로 접속
-> ECDSA host key 생성에 대해 묻지 않음
known_hosts 삭제
rm -f known_hosts
다시 ssh -l root centos7 로 접속
ssh -l root centos7
ECDSA host key 생성에 대해 물음
known_hosts에 centos7 key가 추가하기
ssh-keyscan centos7 > .ssh/known_hosts
다시 ssh -l root centos7 로 접속
접속 성공
ssh-keygen -q -f ~/.ssh/testkey.pem -N ""
-N: 비밀번호 설정은 안 함
ls ~/.ssh
testkey.pem이 생성되었음
vi testkey.pem
-> 전체 복사하기
[centos8]
touch testkey.pem
vi testkey.pem
-> 전체 붙여넣기
chmod +x 600
ssh -i testkey.pem
[centos7]
vi /etc/ssh/sshd_config
passwordauthentication no로 변경
cd .ssh
cp testkey.pem.pub authorized_keys
systemctl restart sshd
[centos8]
ssh -i testkey.pem centos7
ssh -i testkey.pem centos7 hostname
ssh -i testkey.pem centos7 ifconfig ens32
실제 환경이라면 관리 서버에서 key-pair를 생성한다.
관리자는 private key를 갖는다. public key는 내가 관리하고자하는 다수의 서버에 등록시킨다.
원격지에 있는 서버에 public key를 등록하기 위해서는 ssh-copy-id를 이용한다.
관리용 서버의 .ssh/authorized_keys에 등록시킨다.
우리는 인스턴스 템플릿 이미지에 미리 public key를 넣어둘 예정이다.
[centos7]
user 생성
useradd user10
passwd user10
[패스워드 지정]
user 생성 더 간단하게
useradd user20
echo 'user20:user20' | chpasswd
user 생성 더 더 간단하게
useradd user30 && echo 'user30:usr30' | chpasswd
-> 계정이 생성되었고 비밀번호도 설정된 것 확인
일반 사용자는
sudo systemctl restart firewalld
-> 실행 불가
vi /etc/sudoers
:set nu
107째 줄 -> wheel은 모두 실행 가능
groups user1
-> wheel 그룹에 속해있음
su user1
sudo systemctl restart firewalld
-> 실행 가능하다
-> wheel group 안에 포함되어있기 때문
groups user30
-> user30 : user30
vi /etc/sudoers
:set nu
107째 줄 -> 주석처리
110째 줄 주석 해제 -> wheel 그룹은 패스워드 없이도 실행 가능
usermod -aG wheel user30
-> user30을 wheel 그룹에 추가
su user30
sudo systemctl restart firewalld
-> 이제 된다
groups user30
-> user30 : user30 wheel