RH253读书笔记(7)-Lab 7 Electronic Mail
Lab 7 Electronic Mail
Goal: To build common skills with MTA configuration
Estimated Duration: 90 minutes
System Setup: Ensure that SELinux and packet filtering are enabled. If you feel confident, then try to complete the lab based only on the specifications given below. The next few pages divide this complex project into manageable sequences.
Following that are step-by-step sequence solutions to guide you through the process of configuring and verifying proper operation.
As with other labs, stationX refers to your actual station as denoted by the last octet of your IPv4 address.
Lab Setup: Instructor: Make sure server1.example.com can receive mail to security@example.com from other hosts.
Situation: You have been asked to set up an email infrastructure for your organization. Your tasks include:
• Create myuser1, myuser2, and compliance users, each with the password redhat
• Users should have IMAPs and POP3s access to the server (using a selfsigned certificate) to check their messages
• Install and configure Postfix
• The MTA accepts connections only from hosts within the example.com or cracker.org subnets
• myuser1 wants to send and receive email as myuser1.alias@stationX.example.com
• Any message sent to mylist is distributed to myuser1, myuser2, and student
• All electronic messages should be archived at /var/spool/mail/compliance
• A copy of every message that mentions the organization's top secret project, "RHCE", should be forwarded to security@example.com
Sequence 1: Dovecot Setup
Scenario: Always divide major projects into discrete components. Installing and configuring Dovecot first allows you to use it for testing the MTA configuration in subsequent sequences.
Deliverable: A working infrastructure for mail retrieval via POPs and IMAPs
Instructions:
1. Install Dovecot.
yum -y install dovecot
2. Confirm that your system date and time are correct.
SSL certificates do not work well when created long before or after the actual time. Check your system's date:
date
You should see a reasonable time and date. If not, you should correct the system date and time before creating your SSL certificate.
3. Generate a private key and self-signed digital certificate.
The first step is to actually generate the private key and self-signed certificate. To avoid setting up a PKI infrastructure and certificate authority, use the Makefile that Red Hat provides:
less /etc/pki/tls/certs/Makefile
In the Makefile, notice the target for %.pem. This target generates a private key and places it in a PEM file. The script then generates a self-signed certificate and appends it to the same PEM file holding the private key.
make checks timestamps when determining which files to process, so find and remove the out-of-box dovecot.pem files:
find /etc/ -name dovecot.pem -exec rm {} \;
Make a new dovecot.pem file containing a private key and self-signed certificate:
make -C /etc/pki/tls/certs dovecot.pem
...output truncated...
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:US
State or Province Name (full name) [Berkshire]:North Carolina
Locality Name (eg, city) [Newbury]:Raleigh
Organization Name (eg, company) [My Company Ltd]:Example, Inc.
Organizational Unit Name (eg, section) []:Enter (leave blank)
Common Name (eg, your name or your
server's hostname) []:stationX.example.com
Email Address []:root@stationX.example.com
make: Leaving directory `/etc/pki/tls/certs'
Double-check the location and permissions of your new dovecot.pem file:
find /etc/pki -name dovecot.pem -ls
7424004 8 -rw------- 1 root root 2145 Feb 18 22:05
/etc/pki/tls/certs/dovecot.pem
The ownership and permissions are appropriate for a new file containing a private key, but it would seem that the dovecot user would be unable to read its private key. However, perusing dovecot.conf finds a comment that the SSL key and cert are loaded before dropping root privileges, so these permissions are OK.
Check /etc/dovecot.conf to see where dovecot expects to find its key and certificate:
grep -e ssl_cert -e ssl_key /etc/dovecot.conf
#ssl_cert_file = /etc/pki/dovecot/certs/dovecot.pem
#ssl_key_file = /etc/pki/dovecot/private/dovecot.pem
#ssl_key_password =
You need to make the settings in dovecot.conf agree with the actual location. You could copy your new dovecot.pem file to both default locations and then adjust ownership and permissions. Alternatively, you can specify the location of the PEM file you just created.
Modify /etc/dovecot.conf to specify:
ssl_cert_file = /etc/pki/tls/certs/dovecot.pem
ssl_key_file = /etc/pki/tls/certs/dovecot.pem
4. Specify the correct imaps and pop3s protocols.
Modify /etc/dovecot.conf to specify only the secure mail retrieval protocols:
protocols = imaps pop3s
5. Test your configuration.
Start dovecot and enable boot-time startup:
service dovecot restart
chkconfig dovecot on
Send a message to root for testing:
echo 'this is a test' | mail -s test root
Wait a few seconds, then check root's email (warning: this will fail):
mutt -f imaps://root@stationX.example.com
You should see a SASL authentication failure. Perusing /etc/dovecot.conf reveals the following comments:
# Note that denying root logins is hardcoded to dovecot binary and can't
# be done even if first_valid_uid is set to 0.
Repeat your test using the student account:
echo 'this is a test' | mail -s test student
mutt -f imaps://student@stationX.example.com
Examine the certificate carefully before accepting it. In particular, check that the hostname is fully-qualified and that the certificate date looks sane. The time is usually expressed in Universal Time Coordinated (UTC), also known as Greenwich Mean Time (GMT).
Sequence 2: Initial MTA Setup
Scenario: This is a complex configuration, so divide it into smaller tasks. For this sequence, concentrate on creating the necessary users and enabling postfix in its default configuration.
Refer to the step-by-step sequence solutions if you need help or wish to compare your solution to the one provided.
Deliverable: User accounts and a Postfix server that starts at boot-time
Instructions:
1. Create the users myuser1, myuser2, and compliance, each with the password redhat.
Add the users and assign passwords:
for NAME in myuser1 myuser2 compliance; do
useradd $NAME
echo redhat | passwd --stdin $NAME
done
Changing password for user myuser1.
passwd: all authentication tokens updated successfully.
...output truncated
2. Install Postfix.
Install the specified MTA and a packet sniffer:
yum -y install postfix wireshark
You will use wireshark to observe network traffic.
3. Set Postfix as your preferred MTA using alternatives.
Stop and disable sendmail,
service sendmail stop
chkconfig sendmail off
Select postfix as your preferred MTA:
alternatives --config mta
There are 2 programs which provide 'mta'.
Selection Command
-----------------------------------------------
*+ 1 /usr/sbin/sendmail.sendmail
2 /usr/sbin/sendmail.postfix
Enter to keep the current selection[+], or type selection number: 2enter
4. Start Postfix and enable it for boot-time startup.
service postfix start
chkconfig postfix on
Confirm that postfix will start at the next reboot:
chkconfig --list postfix
postfix 0:off 1:off 2:on 3:on 4:on 5:on 6:off
This is a good time to back up the original Postfix configuration.
cp -a /etc/postfix /tmp/postfix.orig
Sequence 3: Configuring the MTA to receive mail
Scenario: In this sequence you will configure network access and host-based access controls for your MTA.
Ask your instructor for help if you are unclear on the suggested solution.
Deliverable: A mail server that is available on the classroom subnet and has essential hostbased access controls in place.
Instructions:
1. Use Netfilter to limit access to the specified subnets.
Confirm that you are using stateful inspection for your host firewall:
iptables -nvL | grep -i established
62 4904 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state
RELATED,ESTABLISHED
If your output does not include a rule similar to the one above, then insert that rule into the kernel at this time:
iptables -I INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
Add rules allowing new connections to the MTA and save your configuration:
iptables -I INPUT -p tcp --dport 25 -s 192.168.0.0/24 -m state --state NEW -j ACCEPT
iptables -I INPUT -p tcp --dport 25 -s 192.168.1.0/24 -m state --state NEW -j ACCEPT
service iptables save; restorecon -R /etc/sysconfig
2. Configure Postfix to listen on the classroom interface.
Edit /etc/postfix/main.cf to specify the listening interface:
#inet_interfaces = localhost
inet_interfaces = 192.168.0.X
Restart postfix and confirm that it's listening on the proper interface:
service postfix restart
netstat -tulpn | grep master
tcp 0 0 192.168.0.X:25 0.0.0.0:* LISTEN 16179/master
3.
Test network connectivity from another station. Remote testing is necessary in order to confirm the effectiveness of your firewall rules.
Start the packet sniffer so that you can observe network traffic in case of a problem with your firewall rules:
tshark -ni eth0 -R "tcp.dstport eq 25 or tcp.srcport eq 25"
The above command will show bidirectional traffic between your server and the remote host after the next step. You may use Ctrl-c to break out of tshark at any time. For now, leave it running.
In a third shell, follow the in-kernel connection tracking table. For optimal viewing, arrange your shells so that you can view both tshark and the connection tracking table side-byside. The following command displays the table, where Y is the last octet of your peer's IP address.
watch -n1 'grep 192.168.0.Y /proc/net/ip_conntrack'
Ask one of your peers to telnet to your MTA while you watch the tshark output to confirm that your firewall rules allow traffic. You should see traffic in both directions. You should see the new connection appear in /proc/net/ip_conntrack, as well. Leave tshark running.
Reciprocate by connecting to a peer host. If connectivity is good, you can expect to see an exchange similar to the following, where Y is the peer's station number.
telnet stationY.example.com 25
Trying 192.168.0.Y...
Connected to stationY.example.com (192.168.0.Y).
Escape character is '^]'.
Type Ctrl-] and then quit to exit the telnet session. It is not necessary to test the full SMTP conversation at this point; you merely want to verify two-way communication through your respective firewalls.
4. Add smtpd_client_restrictions to main.cf to supplement firewall rules.
Sometimes an administrator will temporarily disable a firewall during troubleshooting, or perhaps the firewall rules are not as effective as the administrator believes. Therefore it's prudent to add an additional layer of protection.
Review the configuration man page for postconf to familiarize yourself with the proper host-based restrictions. Make sure to use the man page from section 5!
man 5 postconf
Before implementing your changes, check the current configuration. Either look in main.cf or use the following command:
postconf smtpd_client_restrictions
smtpd_client_restrictions = blank
The above output indicates that there is nothing to preserve in the configuration when making changes.
Edit main.cf to include your new restriction. Recall that any line beginning with one or more whitespace characters is considered a continuation of the preceding line.
smtpd_client_restrictions = check_client_access hash:/etc/postfix/access
Now edit /etc/postfix/access, adding the following lines to the bottom:
127.0.0.1 OK
192.168.0.0/24 OK
192.168.1.0/24 OK
0.0.0.0/0 REJECT
The above restrictions allow localhost, example.com, and cracker.org, but reject connections from all networks. Postfix looks for the most specific match in access files, so order within the access file does not matter.
It is a good practice to include IPv6 restrictions despite listening only on the IPv4 address. This ensures that IPv6-to-IPv4 transitional addresses such as ::ffff:192.168.0.X do not slip past an access control mechanism.
Rehash the access file and restart postfix:
postmap /etc/postfix/access
service postfix restart
If your MTA fails to restart, then examine /var/log/messages for errors.
5. Configure the MTA's destination names for incoming mail.
In many deployments, you would need to edit main.cf to modify mydestination, but the specs for this lab require only that your server receive mail addressed to it by the full hostname. It is therefore sufficient to confirm that the current key/value pair specifies the various hostnames for this machine.
postconf mydestination
mydestination = $myhostname, localhost.$mydomain, localhost
Double-check your own hostname:
hostname
stationX.example.com
Make sure the output is a fully-qualified domain name or else your system has a hostname problem that needs to be corrected, possibly with the help of the instructor.
6. Configure the MTA's origin names for outgoing messages.
The specs for this lab do not require domain masquerading. Nevertheless, you should confirm that myorigin is set appropriately:
postconf myorigin
myorigin = $myhostname
You have already verified that your hostname is correct, so no further action is needed.
7. Test SMTP connectivity from another station. Remote testing is necessary in order to confirm the effectiveness of your access controls.
For practice reading the logs, follow the maillog:
tail -f /var/log/maillog
Ask another person in class to send a message to root@stationX.example.com and watch the maillog. If you see messages indicating that mail has been rejected, then look again at /etc/postfix/access or even main.cf in case of typos.
After the maillog shows that a message has been received, check your mail locally using any one of the following commands.
mutt -f /var/spool/mail/root
-OR-
mail
-OR
cat /var/spool/mail/root
Sequence 4: Configuring User-Based Settings
Scenario: In this sequence you will create a distribution list and configure address rewriting. You will also set up the organizational mail archive and test your settings.
Deliverable: Message archival and address rewriting.
Instructions:
1. Set up message archiving.
Search for bcc in man 5 postconf to find the exact syntax for the always_bcc directive.
Edit /etc/postfix/main.cf and add the following line:
always_bcc = compliance
2. Set up inbound aliases. An alias can also be used for distribution lists, which makes this step easy.
Edit /etc/aliases
myuser1.alias: myuser1
mylist: myuser1, myuser2, student
Rehash the aliases by running
service postfix restart
-OR-
newaliases
-OR-
postalias /etc/aliases
3. Set up outbound address rewriting for myuser1.
Begin by searching for "generic" in man 5 postconf. You should find the directive for smtp_generic_maps along with supporting instructions. The instructions provide a reference to man 5 generic, so feel free to explore that page, as well. Specific Examples are provided in /usr/share/doc/postfix-*/README_FILES/ADDRESS_REWRITING_README.
Edit /etc/postfix/main.cf and add the following line:
smtp_generic_maps = hash:/etc/postfix/generic
Edit /etc/postfix/generic and add the following line:
myuser1 myuser1.alias@stationX.example.com
Since postfix is configured to use a hash of this file, you'll need to create one:
# postalias hash:/etc/postfix/generic
This should create a generic.db file, which postfix will use. Note that this file must be regenerated every time generic is updated.
4. Test user-based configuration settings.
Switch to myuser1 and send an email message to mylist at another workstation.
su - myuser1
echo "test message" | mail -vs 'alias test' mylist@stationY.example.com
Ask your peer at stationY to check their incoming messages for verification, then do the same for that person:
mutt -f imaps://myuser1@stationX.example.com
On stationY, the message should be from myuser1.alias@stationX.example.com
On stationX, the message should be from myuser1.alias@stationY.example.com
Sequence 5: Procmail
Scenario: Configure Procmail to capture messages that refer to the organization's secret project, RHCE.
Deliverable: A working Procmail recipe
Instructions:
1. Ensure that Procmail is installed.
rpm -q procmail
Use yum to install Procmail if necessary.
yum -y install procmail
2. Configure Postfix to use Procmail for local delivery.
Postfix includes hooks to enable its built-in, local delivery agent to run a specified command. Locate this option by searching the man page for mailbox_command:
man 5 postconf
Confirm the location of the procmail binary:
which procmail
/usr/bin/procmail
Edit /etc/postfix/main.cf:
mailbox_command = /usr/bin/procmail
Restart your MTA:
service postfix restart
Confirm that your setting was effective:
postconf mailbox_command
mailbox_command = /usr/bin/procmail
3. Test procmail locally using a simple recipe.
Review the Procmail man pages before creating a simple recipe for local testing.
man procmail
man procmailrc
man procmailex
Create /etc/procmailrc and add a simple recipe to make sure that Procmail is working as you expect:
cat > /etc/procmailrc << EOF
LOGFILE=/var/spool/mail/procmail.log
VERBOSE=yes
:0 c
* ^Subject.*rhce
/var/spool/mail/procmail.test
EOF
The simple file above directs Procmail to log its actions verbosely to /var/spool/mail/procmail.log for testing. Recipes start with the "colon zero" line. This recipe includes the c flag to indicate that procmail should continue processing even after a successful match. The star line (*) indicates a regular expression match filter. Procmail ignores case by default, so the regex matches any message with RHCE in any combination of case within the subject line. The last line is the action and instructs procmail to store the message in the file /var/spool/mail/procmail.test.
It's a continuing recipe as indicated by the c flag, so the message will still go into the intended recipient's mailbox even if it matches the regex and is therefore placed into the indicated file.
Placing the procmail output files in /var/spool/mail is essential since both Postfix and Procmail are in the default targeted policy.
With /etc/procmailrc in place, test the recipe by sending a matching message on your machine.
mail -vs test-RHCE student
This is a test
.
Cc:Enter
Mail Delivery Status Report will be mailed to <root>.
The dot on a line by itself terminates input.
Review the mail log:
tail -f /var/log/maillog
You'll find a line containing the following error:
can't create user output file. Command output:
procmail: Couldn't create "/var/mail/nobody" procmail: [7313] Wed Feb 20:41:02 2007 procmail: Assigning "LOGFILE=/tmp/procmail.log" procmail:
Opening "/tmp/procmail.log" procmail: Error while writing to
"/tmp/procmail.log" procmail
Start with a long listing on /var/mail, then follow up as shown:
ls -ld /var/mail
lrwxrwxrwx 1 root root 10 Nov 26 13:49 /var/mail -> spool/mail
ls -ld /var/spool/mail
drwxrwxr-x 2 root mail 4096 Feb 21 20:58 /var/spool/mail/
Noting that only root and members of the mail group have write access to the mail spool directory, consider:
• You could add the nobody user to the mail group, but that would give wide access to the mail spool. Don't do this.
• You could change procmail to run setgid, in which case it would run as the postfix user. Presumably, postfix is a member of the mail group.
Test this assumption:
grep mail /etc/group
mail:x:12:mail,postfix,exim
ll `which procmail`
-rwxr-xr-x 1 root mail 92452 Jul 12 2006 /usr/bin/procmail
Yes, it's a valid assumption, so try making procmail run setgid so that it will run with the privileges of postfix instead of nobody.
chmod g+s /usr/bin/procmail
ll `which procmail`
-rwxr-sr-x 1 root mail 92452 Jul 12 2006 /usr/bin/procmail
mail -vs test-RHCE student
This is a test
.
Cc:Enter
Mail Delivery Status Report will be mailed to
<root>.
tail /var/log/maillog
...output truncated...
delivered to command: /usr/bin/procmail
Confirm that procmail was able to write the files specified in your recipe:
ll /var/spool/mail/procmail*
-rw------- 1 nobody mail 901 Feb 21 21:14 /var/spool/mail/procmail.log
rw------- 1 nobody mail 995 Feb 21 21:14 /var/spool/mail/procmail.test
Excellent! Check the contents of both files.
less /var/spool/mail/procmail.*
4. Extend your recipe to search the entire message. procmailrc (5) indicates that without a specific flag to instruct Procmail otherwise, it will search only the header of messages. Your specification must search the entire message.
Edit /etc/procmailrc and add two flags to the :0 line. Also remove "^Subject" from the regex so that your expression will match all lines and not just the subject. Your completed recipe should appear as:
:0 cHB
* .*rhce
/var/spool/mail/procmail.test
Test again using three messages. The first will test the header match. The second will test the body match. The third will test a message that should not match.
mail -vs test-RHCE student
This is a test that matches the subject keyword.
.
Cc:Enter
Mail Delivery Status Report will be mailed to <root>.
mail -vs test student
This is a test that should match RHCE in the body.
.
Cc:Enter
Mail Delivery Status Report will be mailed to <root>.
mail -vs test student
This is a test that should not match.
.
Cc:Enter
Mail Delivery Status Report will be mailed to <root>.
Check the contents of /var/spool/mail/procmail.test to ensure that it has the first two test messages. The last message should not be present.
mutt -f /var/spool/mail/procmail.test
5. Extend your recipe to forward matching messages to security@example.com.
Search procmailrc (5) for the second occurence of !. The man page explains that this
forwards the message to the indicated address.
Edit /etc/procmailrc once again to make your change. Your recipe should be:
:0 cHB
* .*rhce
! security@example.com
Test again:
mail -vs test root
This test should match rhce in the body.
.
Cc:Enter
Mail Delivery Status Report will be mailed to <root>.
Check your mail log to see if it forwarded the message to the security email address:
grep security /var/log/maillog
You should see a log message indicating that a message has been sent to security@example.com.
• If not, then review /etc/procmailrc or the mail log for errors and try again.
• If yes, then ask the instructor to check the mail for security to confirm that your message was received.
Once you are satisfied that your recipe is working as specified, then remove the logging and verbose directives from /etc/procmailrc.
6. Challenge: why does each matching message result in three forwards to security?
Review the actual messages and your mail log for the answer. One copy of the messsage is delivered to compliance, which triggers procmail. Another copy is delivered to your recipient, which also triggers procmail.
RH253读书笔记(7)-Lab 7 Electronic Mail的更多相关文章
- RH253读书笔记(1)-Lab 1 System Monitoring
Lab 1 System Monitoring Goal: To build skills to better assess system resources, performance and sec ...
- RH253读书笔记(4)-Lab 4 The Domain Name System
Lab 4 The Domain Name System Goal: To install and configure a DNS server System Setup: Throughout th ...
- RH253读书笔记(8)-Lab 8 Securing Data
Lab 8 Securing Data Goal: Gain familiarity with encryption utilities Sequence 1: Using SSH keys with ...
- RH253读书笔记(2)-Lab 2 System Resource Access Controls
Lab 2 System Resource Access Controls Goal: To become familiar with system resource access controls. ...
- RH253读书笔记(3)-Lab 3 Securing Networking
Lab 3 Securing Networking Goal: To build skills with the Netfilter packet filter Sequence 1: Applyin ...
- RH253读书笔记(6)-Lab 6 Implementing Web(HTTP) Services
Lab 6 Implementing Web(HTTP) Services Goal: To implement a Web(HTTP) server with a virtual host and ...
- RH253读书笔记(5)-Lab 5 Network File Sharing Services
Lab 5 Network File Sharing Services Goal: Share file or printer resources with FTP, NFS and Samba Se ...
- RH253读书笔记(9)-Lab 9 Account Management Methods
Lab 9 Account Management Methods Goal: To build skills with PAM configuration Sequence 1: Track Fail ...
- RH033读书笔记(6)-Lab 7 Standard I/O and Pipes
Lab 7 Standard I/O and Pipes 1. [student@stationX ~]$ cat /proc/cpuinfo /proc/meminfo 2. [student@st ...
随机推荐
- Maven插件之git-commit-id-plugin
SCM使用GIT而非SVN时,使用Maven发布,总是会出一些莫名其妙的问题,google查找原因,无意中看到了这个插件; 对于该插件,到目前为止,文档比较少,尤其是中文的文档;全部的信息都包含在项目 ...
- git笔记之解决eclipse不能提交jar等文件的问题
今天用git托管了一个java web项目,由于是web项目,所以要上传jar文件(此项目未使用maven管理),一直使用git commit and push,就是在server上看不到jar文件上 ...
- [Unity3D]Unity3D游戏开发之飞机大战项目解说
大家好,我是秦元培,欢迎大家继续关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 首先感谢大家对我博客的关注,今天我想和大家分享的是一个飞机大战的项目.这是一个比較综合的 ...
- Hibernate对象持久化框架
JDBC:(Java Data Base Connectivity)java数据库连接 java.sql包提供JDBC API,可通过它编写訪问数据库的程序代码.当中经常使用的接口和类包含以下内容: ...
- 解决.net的堆碎片化带来的内存占用过大的问题
场景 使用WCF开发的服务端在多个客户端登录后,其服务器的内存占用不断增加. 分析 使用Windbg分析得到内存碎片化严重,其中包含了非常大的空闲空间,最大的一块竟然有150M,真正使用的空间其实很小 ...
- VC6 鼠标钩子 最简单样例
Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的.而钩子是Windows系统中非常重要的系统接口,用它能够截获并处理送给其它应用程序的消息,来完毕普通应用程序 ...
- Mac下使用MySQL
0 安装 http://cdn.mysql.com/Downloads/MySQL-5.6/mysql-5.6.17-osx10.7-x86.dmg http://dev.mysql.com/down ...
- Vijos P1881 闪烁的星星 (加强自己多一点。。)
假设每次查询不是整个长度,但[x, y]此时间间隔. . 闲来无事写的,感觉是正确的.这将成为合并范围. #include <cstdio> #include <cstring> ...
- Java 8 时间日期库的20个使用示例
java 8是如何处理时间及日期的 有人问我学习一个新库的最佳途径是什么?我的回答是,就是在实际项目中那样去使用它.在一个真实的项目中会有各种各样的需求,这会促使开发人员去探索和研究这个新库.简言之, ...
- SQL Server数据库视图
1:什么是视图 2:视图和查询的区别 3:视图的优点 4:如何创建和管理视图 5:如何通过视图修改基本表的数据 6:如何通过视图实现数据的安全性 A:什么是视图: 视图(view):从一个或几个基本表 ...