CPU ( Central Processing Unit, 중앙 처리 장치 )의 구조적 이해

 

CPU의 개념

 

입력 장치 -> 자료 입력 -> CPU 연산 -> 결과 출력

위 일련의 과정을 제어하는 핵심 장치

 

CPU 구성요소

- ALU ( Arithmetic Logic Unit, 산술 논리 장치 )

산술 및 논리 연산 수행

 산술연산 : +, -, ×, ÷

 논리연산 : AND, OR, NOT, XOR

 

- Register

CPU 내부 소규모 데이터, 중간 결과를 일시적으로 기억해 두는 고속의 전용 영역

 

- Control Unit ( 제어장치 )

프로그램 코드를 해석, 실행을 위한 제어신호 발생

 

- 내부 CPU 버스

ALU 와 레지스터 간의 데이터 이동 경로

 

 

내부 레지스터의 종류

 

PC ( Program Counter )

 - 다음에 수행할 명령어가 저장된 주기억장치의 번지를 지정

 

MAR ( Memory Address Register )

 - 주기억장치에 접근하기 위한 주기억장치의 번지를 기억

 

MBR ( Memory Buffer Register )

 - 주기억장치에 입/출력할 자료를 기억

 

IR ( Instruction Register )

 - 주기억장치에서 인출한 명령코드를 기억

 

 

버스 시스템 ( Bus System )

버스(Bus) 의 정의

 

시스템에 많은 장치를 공유하여 데이터, 주소, 제어 정보를 전달하는 전송라인

버스를 획득하기 위한 경합이 발생 - 사용방식에 따라 입출력 성능에 영향

 

버스(Bus) 종류

 

데이터버스

시스템 컴포넌트간 처리 데이터를 전송

 

주소버스

기억장소의 위치, 장치 식별 지정

라인의 비트 수에 따라 접속 될 수 있는 장치의 용량이 결정

 

제어버스

CPU와 기억장치 또는 I/O 장치 사이의 제어 신호 전송

 

 

CPU의 명령 실행주기 ( Instruction Cycle )

하나의 명령어 실행이 끝난 후부터

다음 명령어의 수행이 시작되어 끝날때까지 걸리는 시간

 

인스트럭션 사이클 ( Instruction Cycle )

 

인출 ( Fetch )

메모리 ( Memory ) 에서

데이터를 로드 ( Load ) 하여

CPU에 있는 레지스터 ( Register )에 적재

 

간접 ( Indirect )

메모리를 참조할 때 간접 주소 방식을 사용하는 경우

 간접주소 : 해당 주소의 메모리에 데이터가 바로 있는 것이 아니라, 데이터의 주소가 있을 때.

               그 주소를 참조하여 데이터를 획득

 

실행 ( Execution )

명령과 데이터로 CPU가 산술 및 논리연산 수행

 

인터럽트 ( Interrupt )

작동중 예기치 못한 문제 발생시, 업무 처리가 계속 될수 있도록 하는 컴퓨터 운영체제의 기능

 

 하드웨어 인터럽트

  - 기계착오 인터럽트, 외부 인터럽트, 입출력 인터럽트, 프로그램 검사 인터럽트

 

 소프트웨어 인터럽트

  - CPU 내부에서 자신이 실행한 명령이나, CPU의 명령 실행에 관련된 모듈이 변화하는 경우 발생

'정보 보안 > 시스템 보안' 카테고리의 다른 글

시스템 보안 개요  (0) 2019.05.28

운영체제 이해 및 관리

CPU의 구조적 이해

메모리 시스템

I/O 인터페이스

 

운영체제 구조

운영체제 개요

프로세스 관리

CPU 스케줄링 기법

병행성 제어

장치 관리 방법

 

리눅스 서버 보안

리눅스 보안

리눅스 구조

리눅스 인증과 권한 관리

로그파일 및 주요 명령어

리눅스 방화벽

 

윈도우 클라이언트 및 서버 보안

윈도우 시스템

NTFS 시스템

공유폴더 취약점

레지스트리

이벤트 로그 및 웹 아티팩트 분석

바이러스와 악성코드

 

* 2019 이기적 정보보안 기사 책으로 공부하며 정리한 내용입니다.
문제가 될 시, 알려주시면 삭제 및 수정등의 적절한 조치를 취하겠습니다.

 

정보보안 기사 자격증 시험에 나오는 과목 정리

( 산업기사는 정보보호 관련 윤리 법규 제외 )

 

시스템 보안

운영체제 이해 및 관리

운영체제 구조

리눅스 서버 보안

윈도우 클라이언트 및 서버 보안

네트워크보안

네트워크 일반

네트워크 활용

네트워크 기반 공격기술의 이해 및 대응

네트워크 대응 기술 및 응용

최신 네트워크 위협 및 대응기술

애플리케이션 보안

인터넷 응용 보안

데이터베이스 보안

전자상거래 보안

기타 애플리케이션 보안

정보보호 일반

보안 요소 기술

접근 통제

전자 서명

암호학

정보보안 관리 및 법규

정보보호 관리

정보보호 관련 윤리 및 법규

 

 

특정 요일에 무조건 이라던지..

 

적어도 매일 한개의 글쓰기라던지..

 

습관이 되기전에 너무 큰 목표를 잡았나보다.

 

1년만에 다시 시작하는 목표로는

 

매일 티스토리 로그인 한번 하기.

 

일단은 이것부터.

 

 

 

'생각' 카테고리의 다른 글

실천은 항상 어려운것.  (0) 2018.04.25
무엇을 해야할까.  (0) 2016.08.31
아쉬운 1분1초  (0) 2016.08.23
행복  (1) 2016.08.18
새로운시작  (0) 2016.08.17

DNS ( Domain Name System )


- 도메인에 대한 IP주소를 리턴


- 쿼리

- 순환쿼리 : 클라이언트가 DNS 서버에 쿼리 전송 ( DNS Request )

- 반복쿼리 : DNS 캐시 테이블에 해당 도메인 정보가 없거나, Zone 파일에 해당 도메인이 없는 경우, 외부 DNS에 쿼리를 요청


- DNS 이름해석 순서

- DNS 캐시테이블 확인

ipconfig /displaydns

- windows\system32\drivers\etc\hosts.ics

- windows\system32\drivers\etc\hosts

- DNS 서버 쿼리 ( 53번 포트 )

- /etc/hosts

- DNS 캐시테이블 확인 및 zone 파일

- 반복쿼리


- DNS 구조

- 마스터와 슬레이브

- Zone Transfer : Master DNS의 zone파일을 Slave DNS에 전송, 단방향

Slave DNS에 Master DNS를 named.conf에 등록 


- DNS 공격

- 파밍 : 가짜사이트

- DNS Spoofing : DNS 캐시테이블을 변조하여 가짜 IP주소를 전송하게함

- DNS 증폭공격 : DNS의 Record Type 을 ANY 로 요청 1개의 요청에 5개의 응답 ( A, AAAA, SOA, MX, CNAME )


- DNSSEC

- root DNS에 대해서 인증과 전자서명을 수행한다.

- 공개키 암호화 기법 사용

- keygen으로 개인키 생성

- 인증기관 ( CA ) 에 인증을 의뢰


- DNS Spoofing 공격

- dnsspoof -i eth0 zone.dns 

- fragrouter -B1 : normal IP 포워딩


- 스니핑 : 수동적 공격, 정보획득

- tshark , tcpdump : 특정 인터페이스 패킷을 모니터링하는 도구

- tcpdump -i eth0 -w a.cap -c 10 : eth0 의 패킷 10개를 a.cap 파일에 쓰기

- 응용계층에서 데이터링크계층의 헤더까지


- telnet 및 ssh : 원격 접속

- vi /etc/xinetd.d/telnet 설정 변경 ( disable = no )

  service xinetd restart

- telnet www.naver.com 80

  Trying -> Connected -> 배너정보


- 포트스캐닝

- 알려진 포트를 확인한다.

  20 : FTP 데이터 [액티브모드 일 때], 

  21 : FTP 명령, 

  69 : tFTP ( UDP , 인증없이, secuMode 사용 ),


  22 : SSH,

  23 : TELNET,

  

  80 : HTTP,

443 : HTTPS,


110 : POP3,

143 : IMAP,


135/139 : SMB

445 : MS_DS ( 공유폴더 )


- 알려진 서비스, 프로토콜, 쉘 정보

/etc/services

/etc/protocols

/etc/shells


- 열려진 포트를 전부 확인한다.

nmap -sS : TCP half-open 스캔 ( 스텔스 스캔 )

   -sT : TCP open 스캔

   -sF : FIN 스캔

   -sX : XMAS 스캔

   -sN : Null 스캔






'정보 보안' 카테고리의 다른 글

보안기사 개요  (0) 2019.05.27
리눅스보안 - 부팅, 런레벨, 네트워크관련설정  (0) 2018.04.26

학교에서 자바로 디자인 패턴을 배우면서 이클립스로 진행하다보니 몰랐는데.

터미널에서 자바를 컴파일하고 실행하려고 하니 계속 





위와같이 클래스를 못찾는다고 오류가 나서 글들을 찾으며 


이런저런 시도들을 해보다가


환경변수의 클래스경로에 현재경로 . 이 없어서 안된 것임을 알게되었다.

일단 옵션으로 추가해주니 실행이 된다.




환경 변수의 클래스경로에 현재경로를 추가하고 다시 실행해보니 



잘된다.


이래서 기본이 중요한 것 같다.


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

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

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

리눅스의 부팅

- swap : 디스크의 리눅스 이미지를 메인 메모리에 올린다.

- Loader : LILO, GRUB ( /boot )

- init : Process ID 1번, inittab

- Run Level ( /etc/rc )

1: 싱글유저

3: 다중사용자, 콘솔로그인

5: 런레벨3 + x윈도우 ( startx )

6: 재시작


ifconfig 관련 명령

ifup eth0 : eth0 기동

ifdown eth0 : eth0 종료


network관련 설정 디렉토리 : /proc/sys/net

sysctl -w net.ipv4.icmp_ignore_all=1 : icmp 모두 무시 ( ping 응답 안하기 )

tcp_syncookies=1 : SYN 패킷의 도착 빈도가 일정횟수보다 많을 때 해당 요청을 허용하지 않음

tcp_max_syn_backlog=1024 : 한 소켓이 동시에 SYN요청을 처리할 수있는 한계 설정, 

icmp_echo_ignore_broadcasts : broadcast 주소에 ping 쏘는 것을 막을 수 있다. smurf공격 대응가능

/proc/kernel/randomize_va_space : 프로세스의 스택 시작 주소를 랜덤하게 변경





'정보 보안' 카테고리의 다른 글

보안기사 개요  (0) 2019.05.27
DNS , 포트스캐닝, 스니핑, telnet/ssh 정리  (0) 2018.05.02


 - 패턴인식 중간고사 

 - 보안기사 실기 대비

 - 운동



+ Recent posts