반응형

개요

Mail Server : Mail System 설치

 

Mail Server 구축 / 메일 송신 서비스 설치 (sendmail)

Centos 7 운영체제를 설치해준다.

최소모드로 설치 후 네트워크 설정을 해준다.

 

#yum list sendmail*             // 설치 가능한지 확인

 

#yum -y install sendmail sendmail-cf             // sendmail 과 설정 샘플 파일 설치

 

#file /etc/mail/sendmail.mc                    // text 파일이긴 한데 macro script 프로그램 파일이다. vi로 수정이 가능한데 바로 적용할 수 없다. m4라는 유틸리티를 사용해야 한다.

 

#vi /etc/mail/sendmail.mc

118행을 보면 Addr에 loopback IP 로 되어있다. 즉, 자기 자신만 메일을 보낼 수 있게 되어있다.

메일보내려면 웹 브라우저에서 보내야 하기 때문에 이 loopback IP 를 누구나 접속할 수 있게 0.0.0.0 을 넣어준다.

 

#m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf                 // mc 파일을 리다이렉션을 통해 configuration 파일로 적용(바로 저파일에 서 수정해도 상관없음)

 

#vi /etc/mail/sendmail.cf

89행을 보면 Cwlocalhost 를 Cwkhsec.edu으로 바꿔준다. Cw는 이 도메인에서 이 메일서버를 쓰겠다는 의미이다.

 

#vi /etc/mail/access            // 메일 서버끼리 통신을 하려면 이 설정을 해줘야 한다. 메일 주고 받기가 가능한 목록을 지정해주고 메 일을 주고받게 되어있다. 메일 보안에서는 중요하다

이런식으로 추가해 준다.

- 네이버를 여기에 넣어도 네이버에서 우리를 막아놨기 때문에 메일이 안 간다. (네이버 정책)

 

#makemap hash /etc/mail/access < /etc/mail/access               // access 파일을 바꿀 때 마다 해줘야 한다.

 

access 파일은 중요하기 때문에 변조되면 안된다. 그래서 text 파일을 그대로 쓰지 않고, text 파일을 DB화 한다.

makemap 명령어로 sendmail 의 설정파일을 database 파일인 것처럼 파일을 만들어준다.

무결성 체크도 중요하기 때문에 hash format maps로 변환을 해준다.

 

#systemctl start sendmail

#systemctl enable sendmail

#firewall-cmd --permanent --zone=public --add-port=25/tcp

#firewall-cmd --reload

#netstat -lnt

25번 포트가 저렇게 되어있어야 한다.

 

 

메일 수신 서비스 설치 (dovecot)

#yum -y install dovecot

 

#vi /etc/dovecot/dovecot.conf

 

24행 protocols = imap pop3              // 메일을 받을 때 어떤 프로토콜을 사용하는지 imap 하고 pop3 사용을 해준다. 포트는 각각 하나는 암호화 된 통신 나머지 하나는 암호화 안된 통신 총 4개가 열린다.

 

30행 listen = *, ::             // 모든 IP를 열어준다.

33행 base_dir = /var/run/dovecot/                   // 메일이 도착하면 메일파일 저장 경로

 

우리는 암호화 키가 없기 때문에 설정 파일을 건드려준다. (실제 서버에서는 암호화 통신을 해야한다)

#vi /etc/dovecot/conf.d/10-auth.conf

 

10행 disable_plaintext_auth = no

 

#vi /etc/dovecot/conf.d/10-ssl.conf

 

9행 ssl = yes                        // 암호화 통신하고 일반 통신도 할 수 있다.

 

#vi /etc/dovecot/conf.d/10-mail.conf

 

25행 mail_location = mbox:~/mail:INBOX=/var/mail/%u             // 리눅스의 계정을 메일 계정으로 사용한다

 

121행 mail_access_groups = mail            // 메일 서비스가 사용하는 그룹 권한으로 사용한다.

 

166행 lock_method = fcntl                // fcntl 리눅스 파일 제어 함수, /var/mail/사용자 파일을 보호

#systemctl start dovecot

#systemctl enable dovecot

#firewall-cmd --permanent --zone=public --add-port=110/tcp
#firewall-cmd --permanent --zone=public --add-port=143/tcp
#firewall-cmd --permanent --zone=public --add-port=993/tcp
#firewall-cmd --permanent --zone=public --add-port=995/tcp
#firewall-cmd --reload

 

 

메일 서버 이름 설정

#vi /etc/mail/local-host-names

mail.khsec.edu

#vi /etc/sysconfig/network

HOSTNAME=mail.khsec.edu

#vi /etc/resolv.conf

nameserver 192.168.XXX.XXX              // 설정한 DNS 껐다키면 사라지기 때문에 네트워크 설정에서 DNS1=설정한ip, DNS2=8.8.8.8 로 설정해 준다.

nameserver 8.8.8.8

 

원래 서버는 재부팅을 안하기 때문에 이렇게 해도 상관없는데 우리는 서버를 끄기 때문에 네트워크 설정에서 바꿔주는 것이 좋다.

 

 

메일 보내기 테스트 (cmd 사용)

- 메일 서버에 사용자 2명 추가

#useradd khsec
#passwd 비밀번호
#useradd test5
#passwd 비밀번호

 

 

- 메일 주소

khsec@mail.khsec.edu

test5@mail.khsec.edu

#cd /var/spool/mail/

#tail -f khsec                      // 메일 내용이 실시간으로 보임

 

 

cmd

telnet mail.khsec.edu 25                              // 메일 송신(smtp) 접속

mail from:"test5@mail.khsec.edu"                  // 보내는 사람 주소

rcpt to:"khsec@mail.khsec.edu"                     // 받는 사람 주소

data                    // 메일 내용 작성 시작

hi test5                // 메일 내용

test mail               // 메일 내용

bye                     // 메일 내용

.                         // 메일 작성 종료

quit                    // 메일(smtp) 접속 종료

 

 

메일 받기 테스트 (cmd 사용)

telnet mail.khsec.edu 110              // 메일 수신(pop3) 접속

user khsec                 // 메일 계정 ID 입력

pass 비밀번호            // 메일 계정 pw 입력

list                   // 메일 목록 확인

+OK 1 messages:

1 543                          // 1개의 메일이 있음

retr1                 // 메일 목록 중 1번 메일을 보여달라고 요청

반응형
반응형

개요

html 은 IE / 크롬처럼 브라우저에서 실행된다.

JSP, PHP, ASP 는 웹 서버에서 실행된다.

Apache 웹 서버는 사용자가 요청한 파일이 나한테 있는지 없는지 찾아준다. 만약 파일이 있으면 사용자에게 html 로 전송한다.

JSP, PHP, ASP 는 해석해서 실행해줄 엔진이 필요하다.

나는 PHP 사용할 것이기 때문에 웹 서버에 PHP 파서를 설치해줘야 한다.

 

 

DB Server

#mysql u root p            //MySQL 접속 후 패스워드 입력


>show databases;          // DBMS 안에 어떤 DB가 있는지 보여준다


>use mysql;                  // mysql 사용한다


>show tables;               // 어떤 테이블이 있는지 보여준다


>select * from user;        // user 테이블에 계정정보가 저장되어 있다


>select user from user;      // 사용자 id 만 보여준다

 

root 를 사용하면 만약 프로그램이 해킹 당했을 때 이 DB 는 날라간다.

별도의 사용자를 생성해서 이 사용자에게 특정 DB에만 권한을 줘서 들어갈 수 있게 해준다.


>select user,authentication_string from user;        // root 의 패스워드를 확인, 암호화 되어 있다


>CREATE DATABASE wordpress;         // DB 생성


>CREATE USER webadmin@'web서버 내부 통신용 ip' IDENTIFIED BY '비밀번호';          //계정생성


>GRANT ALL PRIVILEGES ON wordpress.* TO webadmin@'web서버 내부 통신용 ip';          // 권한 부여


>FLUSH PRIVILEGES;

 

 

Web Server

web server에는 MySQL Client가 없기 때문에 설치를 해줘야 한다.

 

#yum -y install mysql

 

#mysql -s 192.168.XXX.XXX(DB 서버 주소) -u webadmin -p      // 접속이 안된다.

 

Web Server 와 DB Server 에서 se리눅스를 꺼준다. 실제 서버에서 끄면 안된다.

명령어 setenfroce 0

 

#mysql -s 192.168.XXX.XXX(DB 서버 주소) -u webadmin -p     // 패스워드를 입력하면 접속이 된다

 

Web Server wordpress 설치

#wget wordpress 홈페이지에서 다운로드 주소 복사해서 설치

 

#tar -xzvf latest.tar.gz         // 압축풀기

 

#yum -y install rsync          // 떨어져 있는 두 개의 서버 간 디렉터리 동기화 해주는 유틸리티 프로그램


#rsync -avP ~/wordpress/ /var/www/html/


#mkdir /var/www/html/wp content/uploads


#chown -R apache:apache /var/www/html/*         // 웹 서버의 동작은 apache 실행권한으로 실행되므로 소유권을 apache로 바꿔준다.


#cd /var/www/html

 

#rm -f index.html            // 전에 테스트로 만든 html 파일 삭제

 

#cp wp-config-sample.php wp-config.php            // 샘플 설정파일을 실제 설정파일로 복사해준다.

 

#vi wp-config.php

 

define( 'DB_NAME', 'wordpress' );
define( 'DB_USER', 'webadmin' );
define( 'DB_PASSWORD', '비밀번호' );
define( 'DB_HOST', 'DB서버 IP' );

 

:wq 저장 후 종료

 

PHP 설치 (7.4 버전)

#dnf -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm 

 

#dnf -y install https://rpms.remirepo.net/enterprise/remi-release-8.rpm

 

#dnf module list php

 

#dnf -y module enable php:remi-7.4

 

#dnf -y install php php-cli php-common

 

#php -v               // 설치된 php 버전확인

 

#yum -y install php-fpm php-gd php-pdo php-mbstring php-pear

 

#vi /etc/php.ini     // php 설정파일 수정

 

short_open_tag = Off 를 On 으로 바꿔준다.

 

#yum -y install php-mysqlnd

 

#systemctl enable php-fpm

 

#systemctl start php-fpm

 

#systemctl restart httpd

 

 

Wordpress Install

http://www.khsec.edu/wp-admin 들어가서 설치해준다.

반응형
반응형

개요

Web server 에서는 하나는 인터넷 통신용 나머지 하나는 DB server 통신용으로 두 개의 랜카드를 설치해준다. 

 

DB server 에서는 웹서버랑 통신용 또는 웹 메일 서버랑 통신용으로 해서 내부 통신만 되는 어댑터만 설치함

DBMS 설치를 위해 인터넷으로 구성시킨다.

 

APM : Apache, PHP, MySQL 의 약자이다. Apache 와 PHP 는 웹서버에 설치하고 MySQL 은 DB 서버에 설치해준다.

 

Web Server

web server 에 centos 8버전을 깔아주고 네트워크 설정에서 어댑터 1은 어댑터에 브리지

두번째 어댑터는 DB 서버랑 통신하는 용도로 내부만 통신하기 위해 호스트 전용 어댑터로 설정해준다.

 

#ip a      // ip 설정 확인

여기서 enp0s3 은 어댑터에 브리지로 설정한 네트워크 랜카드

enp0s8 은 DB랑 내부로 통신하기 위한 네트워크 랜카드이다.

 

#vi /etc/sysconfig/network-scripts/ifcfg-enp0s3

고정 ip 로 설정해 준다.

 

#BOOTPROTO=dhcp    // #으로 주석처리 해준다

DEVICE=enp0s3

NAME=enp0s3

ONBOOT=yes     // 컴퓨터가 부팅되면서 실행

IPADDR=192.168.XXX.XXX

NETMASK=255.255.255.0

GATEWAY=192.168.XXX.1

DNS1=8.8.8.8

 

wq로 vi편집기 저장 후 종료

#ifdown enp0s3

#ifup enp0s3

#ip a

ip a로 확인해보면 ip가 변경되있다.

 

#netstat -nr       // Gateway 를 확인해준다.

 

Gateway와 DNS, www.google.com 에  핑을 날려 통신 테스트를 해준다. 

 

두번째 랜카드를 설정해준다.

두번째 랜카드는 Windows - cmd 에서 ipconfig /all 을 해주고

"이더넷 어댑터 VirtualBox Host-Only Network: " 이 부분을 보고 설정 해줘야 한다.

 

#vi /etc/sysconfig/network-scripts/ifcfg-enp0s8

 

#BOOTPROTO=dhcp    // #으로 주석처리 해준다

DEVICE=enp0s8

NAME=enp0s8

ONBOOT=yes     // 컴퓨터가 부팅되면서 실행

IPADDR=192.168.XXX.XXX

NETMASK=255.255.255.0

 

wq로 vi편집기 저장 후 종료

#ifdown enp0s8

#ifup enp0s8

#ip a

ip a로 확인해보면 ip가 변경되있다.

 

Apache 설치

#yum list httpd                // 설치 가능한지 목록 확인

 

#yum -y install httpd        // 설치해준다.

 

#netstat -lnt                   // 80 포트가 안열려 있다.

 

#systemctl start httpd      // 실행 시켜준다.

 

#systemctl enable httpd   // 웹 서버이기 때문에 껐다 켜도 자동으로 실행되도록 해준다.

 

#systemctl enable httpd  // 실행이 정상적으로 되는지 확인

 

#firewall-cmd --permanent --zone=public --add-port=80/tcp     // 방화벽 허용

 

#firewall-cmd --reload

 

실제 windows 웹 브라우저에서 웹 서버 ip 주소를 치면 Apache 홈페이지가 뜬다

 

#cd /var/www/html

 

#vi index.html

여기에 html 소스를 작성해서 넣으면 웹 브라우저에서 Apache 홈페이지가 아닌 자신이 작성한 홈페이지가 나온다.

 

DNS Server 를 키고 ip 와  www.khsec.edu  를 쳤을 때 자신이 작성한 홈페이지가 나와야 한다.

 

 

 

DB Server

DB server 에 fedora32 를 깔아주고 네트워크 설정에서 NAT 로 설정해준다. DBMS를 깐 후 호스트 전용으로 바꿔준다.

 

 

MySQL 설치

 

아래 홈페이지를 들어가면 MySQL Repository 주소가 나온다.

Repository 주소는 설치파일이 어디서 다운로드 되는지 알려주는 파일이다.

우리는 Fedora32 에 MySQL 을 설치하기 때문에 Fedora32 버전을 다운로드 눌러준다.

로그인을 하면 Download Now 라는 버튼이 있는데 마우스 우클릭 링크주소 복사를 해준다.

 

https://dev.mysql.com/downloads/repo/yum/

 

#wget 복사한 주소

 

#rpm -Uvh 다운받은 rpm 파일

 

#yum repolist |grep mysql      // MySQL 이 설치가 가능한지 목록 확인

 

#yum repolist enable |grep mysql    // 활성화된 목록이 있는지 확인

 

#yum -y install mysql-server

 

#netstat -lnt          // :3306 포트가 있는지 확인 (설치만 하고 실행 안했으니 없음)

 

#systemctl start mysqld      // MySQL 실행

 

#systemctl enable mysqld   // 서버를 껐다 켰을 때 자동으로 실행

 

#systemctl status mysqld    // MySQL 서버가 실행 중 인지 확인

 

#netstat -lnt

 

#firewall-cmd --permanent --zone=public --add-port=3306/tcp      // 방화벽 열어주기

 

#firewall-cmd --reload

 

#mysql        // 권한이 없다고 나옴

 

#init 0        // 종료

 

 

IP 설정

네트워크 설정을 호스트 전용 어댑터로 바꾼다.

 

Windows - cmd 에서 ipconfig /all 을 해주고

"이더넷 어댑터 VirtualBox Host-Only Network: " 이 부분을 보고 설정 해줘야 한다.

 

#vi /etc/sysconfig/network-scripts/ifcfg-enp0s3

 

#BOOTPROTO=dhcp       // #으로 주석처리 해준다

DEVICE=enp0s3

NAME=enp0s3

ONBOOT=yes           // 컴퓨터가 부팅되면서 실행

IPADDR=192.168.XXX.XXX

NETMASK=255.255.255.0

 

wq로 vi편집기 저장 후 종료

#ifdown enp0s3

#ifup enp0s3

#ip a

ip a로 확인해보면 ip가 변경되있다.

 

 

root 계정 PuTTY 로 접속 가능하게 하기

#vi /etc/ssh/sshd_config

 

아무 곳에 PermitRootLogin yes 를 추가해준다.

 

:wq로 vi편집기 저장 후 종료

 

#systemctl restart sshd        //sshd 데몬 재시작

 

이제 PuTTY 로 접속이 가능하다.

 

 

MySQL 실행

MySQL 설치할 때 프로그램이 패스워드를 자동으로 부여한다.

그 패스워드는 로그에 있다.

 

#cd /var/log

 

#grep "password" mysqld.log        // 난수로 된 비밀번호 나옴

 

#mysql -u root -p             // password 입력하라고 나오면 복사한 비밀번호 복붙

 

mysql> ALTER USER USER() IDENTIFIED BY '변경할 비밀번호';            // 비밀번호 변경 , OK 가 뜨면 변경 완료

반응형
반응형

DNS 서비스 설치

#yum list bind

 

#yum -y install bind         //DNS 서비스 설치

 

#systemctl start named     //DNS 서비스 실행

 

#systemctl status named   //DNS 서비스 동작 확인

 

#netstat -lntup |grep :53   //53번포트 열려 있는지 확인

 

 

DNS 서비스 설정

#netstat -lntu 을 해줬을 때 state 부분에 LISTEN 이라고 되어 있다.이 LISTEN 뜻은 프로그램이 실행을 해서 다른 사용자가 나한테 들어올 수 있도록 문을 열고 기다리는 상태를 뜻한다.

 

#netstat -lntup 을 해줬을 때 Local Adress 부분에 127.0.0.1 이거나 0.0.0.0 이다. 

 

0.0.0.0 는 모든 ip를 의미한다. 즉 모든 컴퓨터가 포트를 통해 들어올 수 있다는 뜻이다.

 

하지만 127.0.0.1 은 루프백 ip로 나 자신만 접속할 수 있는 상태이다.

 

DNS 서비스는 컴퓨터가 인터넷을 할 때 www.khsec.edu 로 통신을 할 수 없으니 이거에 해당하는 ip를 알려주는 역할이다. 그러므로 다른사람도 접속해야 하기 때문에 바꿔줘야한다.

 

#vi /etc/named.conf

 

:set nu 로 vi 편집기 행 번호를 보이게 한다.

 

11행에 listen-on prot 53 { 127.0.0.1; };  로 되어있는 것을 { any; }; 로 바꿔준다.

 

 

19행에 allow-query    { localhost; };      //누군가가 www.khsec.edu 를 물어보는데 localhost 에게만 허가해줬다는 뜻

 

{ localhost; }; 부분을 { any; }; 로 바꿔준다.

 

 

31행 recursion yes;  //보안상 중요한 옵션이다.

 

재귀쿼리라고 해서 "다른 dns 서버랑 통신을 맘대로 막 할거냐" 라고 물어보는 뜻이다.

 

보안상 recursion no; 로 바꿔준다.

 

 

도메인 주소 설정

 

52행에 zone "." IN { 이 있다. 

여기서 . 은 루트 디렉토리 dns 서버를 의미한다.

dns 는 항상 . 부터 시작해서 내려온다.

만약 www.google.com. 이면 . com google www 순으로 내려온다. 

원래 도메인 뒤에 . 이 있는데 생략해서 쓸 뿐이다.

실제로 접속이 된다.

예)   www.google.com. 

       www.naver.com.

 

사진출처 : 한국인터넷정보센터

 

57행부터 내용을 추가해준다.

 

57 zone "khsec.edu" IN {

58         type master;

59         file "khsec.edu.zone";

60         allow-update {none;};

61 };

 

wq 로 저장하고 종료한다.

#named-checkconf /etc/named.conf       //틀린 오류 찾아줌

아무것도 안뜬다면 오류가 없다는 뜻이다.

 

 

#cd /var/named/

#ls

 

khsec.edu.zone 이름의 파일을 여기서 만들어줘야 한다.

여기에는 named.empty 라는 샘플 파일이 있다.

이 파일을 복사해서 적어주면 된다.

 

#cp named.empty khsec.edu.zone

#vi khsec.edu.zone

 

:set nu 로 vi 행번호를 출력해준다.

 

2행에서 SOA 는 관리 권한의 시작을 의미한다. 보통 이 DNS를 누가 관리하는지 관리자, 도메인 이름 형태로 쓴다.

rname.invalid. 을 지우고 root. 으로 써준다.

 

8행의 NS 는 네임 서버이다.

9행의 루프백 ip를 자기 서버 주소를 적어준다.

9행 밑에 MX        10      mail.khsec.edu. 를 추가시켜준다.

MX는 메일교환기라는 뜻이다. 만약 MX가 없다면 이메일을 보낼 수 없다.

 

13행부터 내용을 추가해준다.

 

13 www     A       192.168.XXX.XXX

14 mail    A       192.168.XXX.XXX

15 ftp     A       192.168.XXX.XXX

16 webmail A       192.168.XXX.XXX

 

:wq 로 저장하고 나와준다.

 

#ls -al

만들어준 khsec.edu.zone 권한이 root root 이다.

dns는 프로그램 권한으로 동작을 해야하기 때문에 그룹 권환을 바꿔준다.

 

#chown :named khsec.edu.zone

 

#ls -al

root named로 바뀐것을 확인 해준다.

 

#named-checkzone khsec.edu khsec.edu.zone

오류를 확인해준다. OK 가 뜨면 정상이라는 뜻이다.

 

설정 파일을 바꿨기 때문에 서비스 재시작을 해줘야 한다.

#systemctl restart named

 

 

방화벽 정책 설정

#firewall-cmd --permanent --zone=public --add-port=53/tcp

#firewall-cmd --permanent --zone=public --add-port=53/udp

#firewall-cmd --reload

 

 

동작 테스트

Windows 에서 cmd 실행해준다.

nslookup 을 쳐준다.

server 본인dns서버ip

 

www.khsec.edu

ftp.khsec.edu

mail.khsec.edu

 

위에 내용을 입력하면 Adress에 zone 파일에 설정된 내용이 나온다.

반응형
반응형

목표 : Linux Base

 

dns + web + db + mail + webmail : 구축 연동

 

- DNS

- APM

- MAIL

- WEB MAIL

- Python을 이용하여 취약점 공격 및 대응

 

 

[목표 구성도]

ns.khsec.edu / www.khsec.edu  / mail.khsec.edu / ftp.khsec.edu / ftp.khsec.edu

 

 

도메인 중복 확인 하는법

만들려는 도메인이 중복일 수도 있으니 확인해야 한다.

Windows 에서 cmd 실행해준다.

 

nslookup 입력

 

server 8.8.8.8 입력 (서버를 구글 DNS로 변경)

 

만들려는 도메인을 입력

 

 

가상 머신에서 Cetos를 설치해준다.

사용한 Centos 버전은 8.1버전

 

Cetos 설치를 했으면 ip를 고정 ip로 변경해준다. (DHCP로 했을 때 ip가 변경될 수 있으므로)

 

Cetos Network 설정

 

설정 file에서 바꾸기

 

#cd /etc/sysconfig/network-scripts

#ls

ifcfg-enp0s3 (랜카드 이름)

#vi ifcfg-enp0s3

 

#BOOTPROTO=dhcp   // #으로 주석처리 해준다

DEVICE=enp0s3

NAME=enp0s3

ONBOOT=yes  // 컴퓨터가 부팅되면서 실행

IPADDR=192.168.XXX.XXX

NETMASK=255.255.255.0

GATEWAY=192.168.XXX.1

DNS1=8.8.8.8

 

wq로 vi편집기 저장 후 종료

#ifdown enp0s3

#ifup enp0s3

#ip a

ip a로 확인해보면 ip가 변경되있다.

 

 

 

Command로 바꾸기

 

ip <- 기본명령어

ifconfig <- net-utils

nmcli <- networkmanager

 

- 네트워크 장치 확인

#nmcli device show

 

- 네트워크 연결 상태 확인

#nmcli connection show     // [show / up / down / modify / add / delete / reload]

 

- 네트워크 연결 추가

#nmcli c add type ethernet con-name enp0s3 ifname enp0s3 ip4 192.168.XXX.XXX/24 gw4 192.168.XXX.1 ipv4.dns 8.8.8.8

 

#ls

enp0s3

 

#nmcli con up enp0s3 ifname enp0s3

#ip a

ip a로 ip가 변경됐는지 확인

 

- 네트워크에 연결이 되어 있는지 확인

#ping 192.168.XXX.1   // gw

#ping 8.8.8.8  // dns

#ping www.google.com  //domain name

반응형

+ Recent posts