IP주소는 하드코딩을 피해라.

책 '자바 코딩, 이럴 땐 이렇게'에서 이번에도 꼭 알아두어야 할 것 같은 부분을 보고 남기려고 한다. 서버 프로그램을 작성할 때 서버의 IP를 소스코드에 하드코딩하는 습관이 바람직하지 않다고 한다.

첫 번째 이유는 관리적인 측면과 유지보수의 측면에서 볼 수 있다. 말 그대로 서버의 IP가 바뀌었거나, 소스 수정을 할 때 하나하나 찾아가며 바꿔야 하기 때문이다. 

두 번째 이유는 보안적인 측면인데, 자바 소스는 디컴파일(decompile)이 가능하기 때문이다. 즉 JVM이 인식하는 코드 .class코드가 유출된다면 IP정보가 쉽게 유출된다는 점이다.


해결 방안

package Test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class Example {
	private static final String DEFAULT_PROPERTIES_PATH = "d://test.properties";

	private static String serverIP;

	public static void main(String[] args) throws Exception {
		setServerIP(Example.getKey("serverIp"));
	}

	public static String getKey(String key) throws Exception {
		String value = null;
		InputStream is = new FileInputStream(DEFAULT_PROPERTIES_PATH);
		Properties properties = null;
		try {
			properties = new Properties();
			properties.load(is);
			value = properties.getProperty(key);

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();

		} finally {
			try {
				is.close();
			} catch (IOException e) {

			}
		}
		return value;
	}

	public static String getServerIP() {
		return serverIP;
	}

	public static void setServerIP(String serverIP) {
		Example.serverIP = serverIP;
	}

}



라이브러리 ws2_32.lib 추가해주고 실행해야한다.

#include <WinSock2.h>
#include <stdio.h>

void ptintMyent(struct hostent *myent);

int main(int argc, char **argv) {
	WSADATA		WSAData;

	if (WSAStartup (MAKEWORD(2,2), &WSAData) != 0) {
		return 1;
	}

	ptintMyent(gethostbyname("web.dongguk.ac.kr"));
	ptintMyent(gethostbyname("www.naver.com"));
	ptintMyent(gethostbyname("www.hanb.co.kr"));

	WSACleanup();
	return 0;

}

void ptintMyent(struct hostent *myent) {
	long int *add;
	SOCKADDR_IN myen;

	if(myent == NULL) {
		return;
	}

	printf("Host name : %s\n", myent->h_name);

	while(*myent->h_addr_list != NULL) {
		add = (long int*)*myent->h_addr_list;
		myen.sin_addr.S_un.S_addr = *add;
		
		printf("%d -> %s\n", add, inet_ntoa(myen.sin_addr));
		myent->h_addr_list++;
	}
	printf("\n");
}


  • 3389 - mstsc(원격데스크톱)
    • 서버 관리자라면 보안 향상을 위해 다른 포트로 변경하는 것이 좋다.

0 ~ 1023 포트는 잘 알려진 포트(Well Known Ports)이고 1024 ~ 49151 포트는 등록된 포트(Registered Ports) 49152 ~ 65535 포트는 동적/개인적 포트(Dynamic and/or Private Ports)로 나뉘어 진다.


윈도우 사용중인 포트 확인하기

cmd -> netstat -ano


대부분의 포트 확인하기1, 2 


포트번호

TCP/UDP

서비스

설명

20

TCP

FTP

FTP 전송 포트

21

TCP

FTP

FTP 제어(명령) 포트

22

TCP

SSH

ssh scp, sftp 같은 프로토콜 및 포트 포워딩

23

TCP

Telnet

암호화되지 않은 텍스트 통신

25

TCP

SMTP

Simple Mail Transfer Protocol - 이메일 전송에 사용

37

TCP

TIME

37

UDP

TIME


42

TCP

NAME SERVER

호스트 네임 서버

49

UDP

TACACS

53

TCP

DNS

Domain Name System

53

UDP

DNS

67

UDP

DHCP

DHCP 서버

68

UDP

BOOTP

69

UDP

TFTP

Trivial File Transfer (인증없는 파일전송)

70

TCP

GOPHER

79

TCP

Finger

핑거

80

TCP

HTTP

World Wide Web HTTP

80

UDP

HTTP

World Wide web HTTP

88

TCP

Kerberos

kerberos 보안 규격

101

TCP

Host Name

NIC Host Name Server

107

TCP

rTelnet

Remote Telnet Service

109

TCP

POP2

Post Office Protocol version 2 - 전자우편 가져오기에 사용

110

TCP

POP3

Post Office Protocol version 3 - 메일 수신

113

TCP

ident

예전 서버 인증 시스템, 현재 IRC 서버에서 사용자 인증에 사용

119

TCP

NNTP

Network News Transfer Protocol - 뉴스 그룹 메시지 가져오기 사용

123

UDP

NTP

Network Time Protocol - 시간 동기화

137

TCP

NetBOIS-ns

 

138

TCP

NetBIOS-dgm

 

139

TCP

NetBIOS-ssn


143

TCP

IMAP4

인터넷 메시지 접근 프로토콜 4 - 이메일 가져오기에 사용

161

UDP

SNMP

Simple Network Management Protocol

177

TCP

XDMCP

원격 호스트 접속 포트

179

TCP

BGP

Border Gateway Protocol

194

TCP

IRC

Internet Relay Char

389

TCP

LDAP

Lightweight Directory Access Protocol

443

TCP

HTTPS

HTTP over SSL (암호화 전송)

445

TCP

Microsoft-DS

액티브 디렉터리, 윈도 공유, Sasser-worm, Agobot, Zobotworm

445

UDP

Microsoft-DS

SMB 파일 공유

465

TCP

514

UDP

syslog

시스템 로그 작성

515

TCP

LPD

프린터 스풀러

540

TCP

UUCP

Unix-to-Unix Copy Protocol

542

UDP

542

UDP

554

TCP

rtsp


587

TCP

SMTP

email message submission

593

TCP

RPC over HTTPS

Exchange Server

636

TCP

LDAPS

IDAP Protocol over TLS/SSL

666

TCP

873

TCP

rsync

파일 동기화 프로토콜

989

TCP

FTPS

FTP Protocol, Data, over TLS/SSL

993

TCP

IMAPS

IMAP4 Protocol over TLS/SSL

995

TCP

POP3S

POP3 Protocol over TLS/SSL

1521

TCP

Oracle

Oracle 

1935

TCP 

Wowza

동영상 스트리밍 서버

3306

TCP

MySQL

MySQL 서버

3389

TCP

TERMINAL

넷미팅 원격 데스크탑


참고1, 참고2, 참고3, 참고4



 실행환경

 Desktop

 조립식

 CPU

 Intel(R) Core(TM) i7-3770 3.50GHz

 Memory

 4 GB

 OS

 Window 7 Professional 32bit

 Java

 1.7.0_51

 Android

 SDK : 4.4.2 (KitKat) / 테스트기기 : Galaxy S3 4.3(Jelly Bean)

 WebServer

 Apache Tomcat 7.0

 DB

 MySQL 5.6.15


출발지, 목적지 포트확인 수식



// 주석안의 내용은 수식을 설명한 것 이므로 적용시킬때는 지워야 한다. // + N("내용")의 내용은 수식내에 사용할 수 있는 주석이므로 지우지 않아도 된다. =IF(OR(+N("AND(AND(출발지, OR(포트)), AND(도착지, OR(포트)))"), // ↓ 출발지가 all이고, 도착지를 지정해놓은 경우 AND(AND(TRUE, OR(TRUE)), AND($F2="1.2.3.456", OR($G2=80))), // ↓ 출발지는 검사하지 않고, 도착지만 확인하는 경우 AND($F2="1.2.3.456", OR($G2=80, $G2=3389)), AND($F2="1.2.3.456", OR($G2=80)), // ↓ 출발지는 검사하지 않고, 도착지의 포트가 모두 all인 경우 AND($F2="1.2.3.456", TRUE) + N("편집실 all"), // ↓ 출발지의 IP와 모든 포트, 도착지의 IP와 포트를 확인하는 경우 AND(AND($D2="1.12.3.456", TRUE), AND($F2="1.2.3.456", OR($G2=3389))) + N("스트리밍"), AND($F2="1.2.3.456", OR($G2=3389, $G2=1935)) + N("스트리밍"), AND($F2="1.2.3.456", OR($G2=1935, $G2=177, $G2=8086, $G2=21, $G2=22, $G2=1521, TRUE)) + N("개발용"), AND($F2="1.2.3.456", TRUE) + N("필요없음") ), "허용", "제한")


=IF(OR(+N("AND(AND(출발지, OR(포트)), AND(도착지, OR(포트)))"),
AND(AND($D2="출발지 IP주소", TRUE), AND($F2="도착지 IP주소", OR($G2=포트))) + N("주석"),
), "허용", "제한")



컴퓨터의 내부 구조

모든 컴퓨터의 내부 구조는 크게 세 부분으로 나누어진다. : 

  CPU(Central Processing Unit, 중앙처리장치), 메모리, I/O(Input/Output, 입출력) 장치.

CPU는 버스(bus)라 불리는 여러 가닥의 전선을 통해 메모리와 I/O장치에 연결되어 있다.

컴퓨터에는 어드레스 버스(address bus), 데이터 버스(data bus), 컨트롤 버스(control bus)의 세 가지 종류의 버스가 있다.


버스(bus) : 구성 요소들간에 교환할 각종 정보들을 전송하는 선(line)들로 구성.

1) 데이터 버스(data bus)

  · CPU와 장치 사이의 정보 교환을 위한 선들의 집합.

  · 양방향 전송.

  · 크기가 클수록 CPU의 성능이 좋다고 할 수 있다.

2) 어드레스 버스(address bus)

  · CPU에 연결된 메모리와 장치를 선택하기 위한 선들의 집합.

  · 단방향 전송

  · 클수록 더 많은 양의 메모리 혹은 장치를 번지지정할 수 있다.(기억장치의 용량이 결정)

    x를 어드레스 라인의 수라고 할 때 메모리의 최대 위치 개수는 

3) 컨트롤 버스(control bus)

  · CPU와 기억장치 및 I/O 장치 사이에 제어 신호들을 전송하는 선들의 집합.


CPU와 RAM, ROM과의 관계

CPU가 처리할 정보는 RAM이나 ROM에 저장되어 있어야 한다. ROM(Read Only Memory)은 비휘발성 메모리로써 컴퓨터 작동에 필수적인 프로그램, RAM을 테스트하고 설치된 RAM의 크기를 알아내는 프로그램등 변하지 않고 꼭 필요한 정보만을 보관하고 있다가 CPU에 제공한다. RAM(Random Access Memory)은 전원을 끄면 보관되어 있던 데이터는 모두 사라지는 휘발성 메모리로써 실행되고 있는 프로그램을 일시적으로 저장하거나 사용자나 프로그램에 의해 내용을 바꿀수 있는 정보를 저장하기 위해 사용되며 예로 들면 워드프로세싱, 운영체제등 응용프로그램들이 해당된다.

CPU는 처리할 정보를 먼저 RAM, ROM에서 찾아보고 없을 경우 디스크에서 찾는다. 디스크에 있는 정보는 먼저 RAM으로 옮겨진 다음 처리되는데 이런 이유로 해서 RAM, ROM을 주기억장치(primary memory), 디스크를 보조기억장치(secondary memory)라 부르기도 한다.


CPU의 내부

CPU의 가장 기본적인 기능은 메모리에 저장되어 있는 명령어를 읽어와서 수행하는 것이다.  

1. 레지스터(register)CPU가 가지고 있는 자원 중 가장 중요한 것으로 정보를 일시적으로 저장하기 위해 사용

   레지스터가 많을수록 좋은 CPU지만 그 만큼 가격이 비싸다.

2. ALU(Arithmetic / Logic Unit, 연산장치) : 산술연산과 논리연산을 수행한다.

3. PC(Program counter) : 다음에 수행할 명령어의 주소를 가르킴. IBM PC에서는 IP(instruction pointer)라고 부른다

4. 명령어 디코더(instruction decoder) : CPU 내부로 읽어온 명령어를 해독하는 역할.

   따라서 명령어의 의미를 보관하고 있다가 어떤 명령어가 주어지면 CPU가 어떤 작업을 해야 하는지 알려주는 역할.

+ Recent posts