포스팅은 총 4단계로 나누어서 진행하구요, 이 글애는 메일서버구축을 위한 사전준비를 포스팅 하려고 합니다.
최대한 쉽게 따라오실 수 있게 노력했으니 도움이 됐으면 좋겠습니다.!
자 이제, 시작해보겠습니다.
공유기에 라즈베리파이를 물리고 전원을 켜줍니다.
켜준 뒤 첫번째로 세팅할 곳은 공유기입니다.
제일 처음 공유기에 로그인을 해주시고(보통 192.168.0.1로 접속하시면 됩니다)
고급설정 -> 네트워크 관리 -> 내부 네트워크 설정에 들어갑니다.
들어가시면 현재 라즈베리파이가 잘 연결되어 있으며 할당되어 있는 IP는 192.168.0.6인걸 확인 할 수 있습니다.
다음으로는 포트포워딩 설정입니다.
고급 설정 -> NAT/라우터 관리 -> 포트포워드 설정에 들어갑니다.
안에 들어가시면 위 사진과같이 설정이 되어있어야 합니다.
설정 하는 방법은 간단한데 밑에 보이는규칙이름에 임의의 이름을 넣고내부 IP주소,
곧 아까 확인한192.168.0.6를 입력하면 됩니다.
그리고외부포트와내부포트는 각각 사진의 있는 값을 따라서 적으시면 됩니다.
2번의 ssh2룰은 외부에서 내부로 도메인을 사용해 ssh로 접속할때 쓰기위한 룰입니다
3번룰은 2단계에서 Letsencrypt를 사용해서 인증서를 만들때 웹서버 인증이 필요하기 때문에 필요한 룰입니다.
4,5번룰은 SMTP에서 사용하는 포트를 포워딩 해주는 룰입니다.
6~9번까지의 룰은 IMAP/POP3에서 사용하는 포트들을 포워딩 해주는 룰입니다.
포워딩을 마친 뒤에 고급 설정 -> 특수기능 -> DDNS설정이라고 써진 메뉴를 들어갑니다.
이 페이지 붉은색으로 네모쳐진 곳에 두가지 값을 입력해야하는데, 호스트 이름은 DDNS의 이름을 입력하는 칸이고
사용자 ID는 사용하시는 이메일 주소를 넣으시면 됩니다.
호스트이름에 넣으시는 이름이 곧 외부에서 내부로 접속할때 사용되는 DDNS이름이 됩니다!
2칸을 모두 채워주시고 생성버튼을 누르면 위 사진과 같이 DDNS가 등록되게 됩니다.
이렇게 따라와 주셨으면 공유기 설정은 모두 마쳤습니다!
이제 도메인을 세팅할 차례입니다.
저는hosting.kr에서 도메인을 구입했습니다.
hosting.kr의 서브도메인 설정화면은 위 사진과 같으며, 총 3개의 서브도메인이 보이지만...
www도메인은 제 웹서버 도메인이므로..생략해도 됩니다 ㅋㅋ
최상위 도메인(아무것도 없는 도메인)에는 A레코드로 아까 만든 DDNS에 대한 IP,
(cmd에서 ping [ddns 주소]하면 실제 IP를 확인할 수 있습니다.)
mail서브도메인에서는CNAME으로 아까 생성했던 DDNS 주소를 입력하고 적용합니다.
여기까지 오셨으면 도메인 세팅도 끝났습니다!.
이제 라즈베리파이를 세팅할 차례입니다.
저는 putty를 사용하여 제 rpi에 접속하였습니다. 접속시 실제 도메인을 사용하여 로그인하였습니다.Host Name에는 도메인이름을Port에는 아까 공유기에서 포트포워딩해준 포트 60001번을 넣고 Open을 눌러 접속합니다.
그리고 pi/raspberry로 로그인을 합니다. (이 계정과 비번은 기본 세팅이니 꼮 변경해주시기 바랍니다!!!!변경필쑤!!)
로그인을 한 뒤 아래 명령어를 입력 해 루트계정으로 작업을 실행합니다(매번 sudo를 치기 귀찮기 때문이죠...후훗)
sudo su
참고로 현재 상태에서는root계정에 대해 비밀번호가 걸려있지 않기 때문에 반드시 비밀번호를 설정해주시기 바랍니다!!! 제발요.. 꼭 해주세요...
root계정으로 접근한 뒤, 아래의 명령어를 입력하여 시스템을 최신버전으로 업데이트 해줍니다.
apt update; apt upgrade -y
이 단계는 옵션입니다. 저는 개인적으로 VIM을 선호하기때문에 라즈베리파이에 설치해 줍니다.
apt install vim
다음으로는 host이름을 변경합니다.
vim /etc/hostname
#이 명령어로 hostname 파일을 열고
dd
#raspberrypi 를 지워줍니다
i
#입력모드로 전환합니다.
mast3r.com
#자신의 도메인주소를 적어줍니다
esc
#esc버튼을 눌러 입력모드를 나갑니다
:wq
#위 명령을 입력하여 저장 후 닫습니다.
다음은/etc/hosts파일을 변경해야합니다.
위에서 했던 것 처럼 값을 변경/입력해줍니다. 변경할 값은127.0.1.1을 도메인 이름으로 변경하고 새 줄에는 DDNS대한 IP주소를 삽입 후 도메인을 입력하면 됩니다! (제 IP는 가렸습니다. 소중하니까요..ㅋㅋ어차피 ping때리면 나오는데.. 왜가렸을까)
어쨋든! 이렇게 하시면 기본설정은 끝났습니다.
이제 실제 이메일에 사용될 계정을 만들어보도록 하겠습니다.
이렇게 간단할 수가....
useradd linux
usermod -G mail linux
usermod -s /usr/sbin/nologin linux
passwd linux
이 4문장만 입력하시면 나중에 실제로 사용될 이메일 계정이 만들어지는 겁니다.
vim /etc/passwd
vim /etc/group
계정을 만든 뒤에 위의 파일을 열어서 실제로 계정이 추가됐는지 확인할 수 있습니다.
마지막으로
chown :mail /home
chmod 775 /home
이/home의 그룹을mail로 변경하고 775권한을 주는 이유는 postfix에서 Maildir형식으로 메일 디렉토리를 구성할 것이기 때문입니다.(즉 이메일 계정이 생성될 때 마다/home/[user]/Maildir이 생성됩니다)
모든 명령을 마친 이후에
reboot
리부팅을 해주면 모든 사전준비가 끝나게 됩니다.
따라오시느라 고생하셨습니다! 두번째 글에서는 Postfix설치 및 설정, letsencrypt를 이용한 SSL/TLS 설정을 포스팅 하도록하겠습니다.
이번에 풀어볼 문제는 bWAPP의 A1-Injection Section의 제일 첫번째 문제인 HTML Injection -REflected(GET) 문제입니다!!
문제풀이를 위해 기본페이지에서 위 사진과 같이 로그인을 한다. (ID:bee PW:bug) 밑에 보이는 난이도는 기본으로 low로 설정되어 있으니 바꾸지 말고 로그인한다.
로그인 후에는 위와같이 어떤 취약점을 공략할지 리스트가 나오게 되는데, 제일 처음에 보이는HTML Injection - REflected(GET)을 선택하고 밑의 HACK버튼을 클릭한다.
①에서First name:에 hello,Last name:에 world를 입력하고GO버튼을 누르면 아래에Welcome hello world, 즉 사용자가 입력한 결과를 출력한다. ②를 확인해보면 사용자가 입력했던 값들이 URL로 넘어가는 것으로 GO를 누르면 HTTP GET방식으로 서버에 요청을 보낸다는 것을 확인 할 수 있다.
만약GO버튼이 사용자가 입력한 값을 모두 출력한다면, 입력칸에 HTML TAG를 사용한다면 어떻게 될까?
위 사진같이과 같이 현재 LOW레벨에서는 사용자 입력값에 대한 sanitizing이 적용되지 않아서 사용자가 입력한 값을 모두 그대로 출력하게 된다! 사용자 입력값이 완벽한 HTML TAG이기 때문에 출력되는 값은 HTML TAG가 적용된 TEXT가 나오게 된다!
우측 상단의security level을 Medium으로 바꾸고 똑같이 LOW에서 했던 것 같이 HTML TAG를 입력해보면 이번에는 HTML TAG가 적용되지 않고 사용자 입력 String이 그대로 출력되게 된다.
왜 그런것일까...?
Medium 레벨에서는 입력 값에 대해서 HTML관련 Character가 있으면 해당 문자를 Escaping처리를 하는 함수가 있다는 것을 추측 할 수 있다.
예를들어<가 입력되면 sanitizing기능은 이 문자를%3C로 변환 시킨다.
그렇다면 어떻게 해야 이 Sanitizing기능을 우회할 수 있을까?
에초에 Sanitizing에 걸리지 않는 문자들로 HTML TAG를 Encoding하게된다면? 예를들어 원래는<를 입력해야하지만%3C로 변환하여 입력한다면?%3C는 HTML Character가 포함되어있지 않기 때문에 escaping 되지 않은 채로 출력 되게 된다.
위 사진은Fiddler라는 툴을 이용하여<h1>hello</h1>를 Encoding 한 사진이다. 위의 결과 값을 복사하여First name칸에 복사를 하게되면 아래 사진과 같이 sanitizing을 우회하여 HTML TAG를 적용 시켰음을 확인할 수 있다.
Each new term in the Fibonacci sequence is generated by adding the previous two terms.
By starting with 1 and 2, the first 10 terms will be:
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
By considering the terms in the Fibonacci sequence whose values do not exceed four million,
find the sum of the even-valued terms.
해석 :
피보나치 수열의 다음 수열은 이전의 두 수열을 더한 합과 같다
1과 2로 시작하여 처음 10번째까지의 수열은 다음과 같다:
1, 2, 3, 5, 8, 13, 21, 34, 55, 89
4백만이 넘지 않는 피보나치 수열이 있다고 가정할때
짝수인 피보나치의 수열을 합을 구하여라
코드는 아래와 같다
public static void main(String []args){
int sum = 0;
int f1 = 1;
int f2 = 1;
while(f1<4000000){
f1 = f1 + f2;
f2 = f1 - f2;
if(f1%2==0){
sum=sum+f1;
}
}
System.out.print(sum);
}
문제가 물어보는 것은 피보나치 수열을 짤 수 있느냐를 물어보는 것 같다.
int buf =0;
int f1 = 1;
int f2 = 1;
while(true){
buf = f2;
f2 = f1+f2;
f1 = buf;
}
1번째 줄은 임시 변수
2번째 줄의 f1은 피보나치 첫번째 수열인 1 3번째 줄의 f2는 피보나치 두번째 수열인 1이고
나머지는 일반적으로 간단하게 생각할 수 있는 변수를 3개를 사용하여 계속해서 피보나치 수열을 만들어가는 방법이다
(코드는 돌리지 마시길.. 무한 루프임ㅋㅋ)
하지만 조금 생각해보면 만들어질 새운 피보나치 수열은 현재 변수 2개로 만든다!
int f1 = 1;
int f2 = 1;
while(true){
f1 = f1 + f2;
f2 = f1 - f2;
}
main package는 독립적으로 실행할 프로그램으로 작성 시 package명을 main으로 설정합니다
2. Package import
fmt 라는 데이터의 I/O를 위한 함수들이 들어있는 패키지를 import 합니다
fmt package를 제외하고 표준 라이브러리에는 100개 이상의 패키지가 존재한다고 합니다
패키지 사용시 문법은 import "[package name]" 으로 적습니다. 꺽쇠, 중괄호, 대괄호 다 필요 없구요! 따옴표 사이에 이름만 적어주시면 됩니다. (이 부분은 C에서 넘어오신 분이면 헷갈리실 것 같습니다 보통 import 하실 때 표준라이브러리가 아닌 파일을 import 할때 사용하는 방식이고 표준라이브러리를 import할 경우 꺽쇠를 사용하니까요 ㅎㅎ)
3. Method definition
함수 선언에는 func 키워드를 붙여 함수를 선언 및 정의합니다.
여기서는 main package 에서 main함수를 선언 및 정의하여 독립적으로 구동가능하게끔 코딩되었습니다
내용은 fmt package의 내부 method인 Println을 사용해 Hello, world. 를 출력하는 것 입니다.
helloworld에서 문법 및 주의사항!
문장이 한줄에 두개이상 나오는 경우 외에는 문장끝에 세미콜론을 붙이지 않습니다.
func main() {
// 두 문장이 한 줄에 있기 때문에 구분하기 위해 세미콜론을 붙였습니다.
// 두 번째 문장은 뒤에 더이상 내용이 없기 때문에 세미콜론을 붙히지 않습니다.
fmt.Println("Hello, 세계"); fmt.Println("Hello, World")
}
함수 여는 중괄호가 func 키워드와 같은 줄에 있지 않으면 Syntax Error 발생
// Syntax Error 발생! 중괄호( { ) 는 반드시 func키워드가 오는 줄에 위치해야 합니다
func main()
{
fmt.Println("Hello, 세계")
}
// 옳은 예제
func main(){
fmt.Println("Hello, 세계")
}
실행!
위의 hello world 예제 소스를 helloworld.go 파일로 저장해 준 뒤 , 해당 파일이 있는 곳에서 아래와 같은 명령어로 컴파일 해줍니다.
go build helloworld.go
컴파일이 완료 되게 되면, 리눅스는 helloworld, 윈도우는 helloworld.exe라는 바이너리가 생성됩니다.