2 Mail Server Menggunakan Postfix Dovecot dan Roundcube


Perenacanaan:
Mail server menggunakan OS Ubuntu 11.04 Server
Menggunakan aplikasi postfix, dovecot, sasl authentication, smtp auth, tls, dan roundcube
Web Server menggunakan apache2 serta dukungan php5 dan mysql-server
Dns Server menggunakan bind9
Ip Address Server 192.168.1.1/24
Domain yang digunakan adalah erwin.com
Domain untuk mail server adalah mail.erwin.com
Sertifikat menggunakan default bawaan ubuntu (snake-oil)
Diasumsikan user yang digunakan untuk konfigurasi adalah "erwinheldy" dengan password "jaringan"

Install paket-paket yang dibutuhkan

apt-get install bind9 apache2 dovecot-postfix mysql-server php5 php5-mysql php5-mcrypt php-pear sasl2-bin libsasl2-modules libsasl2-2

Saat proses instalasi ada beberapa konfigurasi yang harus diisi yaitu

mysql root password = password untuk user root
system mail name = nama sistem mail yang digunakan (erwin.com) yang nantinya digunakan untuk domain pada mail (user@erwin.com)

Buat konfigurasi untuk dns server

cd /etc/bind
cp named.conf.default-zones named.conf.local
cp db.local db.erwin.com
cp db.127 db.192

Edit konfigurasi named.conf.local

nano named.conf.local
zone "erwin.com" {
        type master;
        file "/etc/bind/db.erwin.com";
};

zone "1.168.192.in-addr.arpa" {
        type master;
        file "/etc/bind/db.192";
};

Edit konfigurasi db.erwin.com

nano db.erwin.com
;
; BIND data file for local loopback interface
;
$TTL    604800
@       IN      SOA     ns.erwin.com. root.erwin.com. (
                              3         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      ns.erwin.com.
@       IN      A       192.168.1.1
@       IN      AAAA    ::1
ns      IN      A       192.168.1.1
        IN      MX 1    mail.erwin.com
mail    IN      A       192.168.1.1
www     IN      CNAME   @

Edit konfigurasi db.192

nano db.192
;
; BIND reverse data file for local loopback interface
;
$TTL    604800
@       IN      SOA     ns.erwin.com. root.ns.erwin.com. (
                              2         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      ns.erwin.com.
1       IN      PTR     ns.erwin.com.

Restart bind9

invoke-rc.d bind9 restart

Edit konfigurasi resolv agar mengarahkan dns server ke ip 192.168.1.1

nano /etc/resolv.conf
nameserver 192.168.1.1

Lakukan pengujian dns server menggunakan nslookup

nslookup mail.erwin.com

Pastikan hasil nslookup seperti berikut

Server:         192.168.1.1
Address:        192.168.1.1#53

Name:   mail.erwin.com
Address: 192.168.1.1

Tahap berikutnya adalah konfigurasi postfix

dpkg-reconfigure postfix

Tahapan konfigurasi yang harus diisi yaitu

Ok
Internet Site
erwin.com
erwinheldy       --> keterangan: salah satu username yang digunakan
OK
No
127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 192.168.1.0/24         --> keterangan: tambahkan network address
0
+
all

Ubah beberapa konfigurasi postfix di file main.cf

nano /etc/postfix/main.cf

Baris yang harus diubah antara lain

smtpd_sasl_path = private/dovecot-auth
menjadi
smtpd_sasl_path = private/auth-client

smtpd_tls_auth_only = yes
menjadi
smtpd_tls_auth_only = no

Edit konfigurasi dovecot

nano /etc/dovecot/dovecot.conf

Beberapa baris yang harus diubah antara lain

socket listen {
    #master {
      # Master socket provides access to userdb information. It's typically
      # used to give Dovecot's local delivery agent access to userdb so it
      # can find mailbox locations.
      #path = /var/run/dovecot/auth-master
      #mode = 0600
      # Default user/group is the one who started dovecot-auth (root)
      #user =
      #group =
    #}
    client {
      # The client socket is generally safe to export to everyone. Typical use
      # is to export it to your SMTP server so it can do SMTP AUTH lookups
      # using it.
      path = /var/spool/postfix/private/auth-client
      mode = 0660
      user = postfix
      group = postfix
    }
  }
mechanisms = plain
menjadi
mechanisms = plain login

Edit konfigurasi sasl

nano /etc/default/saslauthd
START=no
menjadi
START=yes

Restart konfigurasi

invoke-rc.d postfix restart
invoke-rc.d dovecot restart
invoke-rc.d saslauthd restart

Untuk melihat jika SMTP-AUTH dan TLS bekerja dengan semestinya, jalankan perintah berikut

telnet mail.erwin.com 25

Setelah terlihat status connected ke postfix mail server, ketik

ehlo mail.erwin.com

Jika terlihat baris berikut diantara yang lainnya, berarti semuanya telah bekerja dengan semestinya. ketik quit untuk keluar

250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME

Selanjutnya proses instalasi roundcube, diasumsikan paket tarbal roundcube telah ada di folder /usr/share

cd /usr/share

Extract Roundcube

tar xzf roundcube_0.7.1.tar.gz

Selanjutnya rename folder untuk memudahkan, ganti kepemilikan, dan hak akses untuk roundcube

mv roundcube_0.7.1/ roundcube/
chown -R www-data:www-data roundcube/
chmod -R 755 roundcube/
chmod -R 777 roundcube/logs/
chmod -R 777 roundcube/temp/

Masuk ke mysql console

mysql -u root -p

Buat database untuk roundcube, dan berikan privileges untuk user (dicontohkan user:erwinheldy dengan paswd:jaringan)

create database roundcubemail;
grant all privileges on roundcubemail.* to erwinheldy@localhost identified by 'jaringan';
flush privileges;
exit

Import tabel sql ke database

mysql -u erwinheldy -p roundcubemail < roundcube/SQL/mysql.initial.sql

Edit konfigurasi apache

nano /etc/apache2/sites-available/default

Tambahkan baris berikut di paling bawah

<VirtualHost *:80>
    ServerName mail.erwin.com
    DocumentRoot /usr/share/roundcube
    <Directory "/usr/share/roundcube/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride All
        Order deny,allow
        Allow from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>
</Virtualhost>

Aktifkan modul rewrite

a2enmod rewrite

Restart apache

invoke-rc.d apache2 restart

Akses web

http://mail.erwin.com/installer
Start Installation
Next
product_name        = Erwin Webmail
database username   = erwinheldy
database password   = jaringan
default_host        = erwin.com
smtp_user/smtp_pass = erwinheldy jaringan
checklist           "Use the current IMAP username and password for SMTP authentication"
language            = en_US
checklist           "If preview pane is enabled"
Next>>

Masuk ke folder konfig roundcube

cd roundcube/config

Ketikkan perintah berikut

cp main.inc.php.dist main.inc.php
cp db.inc.php.dist db.inc.php
echo "" > main.inc.php
echo "" > db.inc.php

Edit file main.inc.php lalu copy paste script php yang ada di web sesuai dengan nama file-nya

nano main.inc.php

Edit juga file db.inc.php lalu copy paste script php yang ada di web sesuai dengan nama file-nya

nano db.inc.php

Klik CONTINUE

Instalasi Selesai, hapus folder installer pada roundcube

rm -rf /usr/share/roundcube/installer/

Masuk ke

http://mail.erwin.com

Jika berhasil, maka akan muncul tampilan login roundcube, login dengan username: erwinheldy password: jaringan

Tambahkan folder melalui Settings --> Folders, Klik tanda plus di pojok kiri bawah

Masukkan Folder Name sebagai berikut satu per satu
Drafts
Junk
Trash

Pengujian terakhir yaitu mengirim email ke akun sendiri yaitu ke erwinheldy@erwin.com dari roundcube

Periksa log untuk meyakinkan bahwa proses autentikasi dilakukan dengan secured

tail -f /var/log/mail.log
Feb  1 18:58:54 server dovecot: imap-login: Login: user=, method=PLAIN, rip=192.168.1.1, lip=192.168.1.1, secured
Feb  1 18:58:54 server dovecot: IMAP(erwinheldy): Disconnected: Logged out bytes=91/764

Periksa juga log untuk error log. Jika tidak ada respon maka konfigurasi tidak mengalami error

tail -f /var/log/mail.err

14 Tutorial Membuat Halaman Login Sederhana Yang Aman

Kali ini saya akan memberikan contoh penggunaan database, session, dan enkripsi MD5 untuk menjadikannya sebagai halaman login yang cukup aman.

Kebutuhan:
- Webserver dengan dukungan PHP
- Myslq Database Server

Secara sederhana, cara kerjanya adalah sbb:
- Ketika user memasukkan username dan password-nya, maka yang pertama kali dilakukan adalah mengeceknya dalam database apakah username tersebut telah terdaftar.
- Jika telah terdaftar dan berhasil melakukan login, maka sang user akan diberi sebuah session yang diambil dari usernamenya
- Jika kesemuanya tidak sesuai maka sang user akan diredirect ke halaman login.php, sehingga terlihat seperti diam ditempat.

Pertama-tama kita buat databasenya

create database coba;
use coba;
CREATE TABLE IF NOT EXISTS `users` (
  `username` varchar(20) NOT NULL,
  `password` varchar(200) NOT NULL,
  PRIMARY KEY (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;



selanjutnya kita buat file-file php-nya

config.php

<?php 
//membuat koneksi ke database
mysql_connect("localhost", "root", "admin");

//localhost = nama server-nya
//root  = user mysql
//admin  = password user root
 
//memilih database
mysql_select_db("coba");
?>


login.php

<?php 
//memulai session
session_start(); 

//cek adanya session, jika session sudah ada maka diarahkan ke index.php
if (ISSET($_SESSION['username'])){
header("location: index.php");
}
?>


<form method="post" action="cek.php">
<pre>Username <input name="username" type="text">
Password <input name="password" type="password">
  <input name="submit" value="Login" type="submit">

  Bukan Member? Silahkan Daftar
  <a href="signup.php">Daftar</a>
  
</pre>
</form>  


cek.php

<?php 
//memulai session
session_start(); 

//koneksi ke database
include "config.php" ; 

//mengambil data dari form
$username    = $_POST['username']; 
$password    = $_POST['password']; 

//enkripsi password dengan md5
$password_md5   = md5($password);

//cek username dan password dari database
$perintah   = "select * from  users where username='$username'&&password='$password_md5'"; 
$perintah_di_query = mysql_query($perintah); 
$ketersediaan  = mysql_num_rows($perintah_di_query); 

//Cek adanya username dan password di database dilanjutkan dengan membuat session
if ($ketersediaan >= 1 ){ 
$_SESSION['username'] = $username; 
header("location: index.php"); 
}else{
header("location: login.php"); 
}
?>


index.php

<?php 
//memulai session
session_start(); 

//cek adanya session
if (ISSET($_SESSION['username'])){
echo "Anda Login Sebagai ";
echo $_SESSION['username']; 
echo "<br><a href='logout.php'>logout</a>"; 

//jika tidak ada session
}else{
header("location: login.php");
}
?> 
<html><body>
<br><br><h2>
Home Page
<br><br></h2>
</body></html>


logout.php

<?php  
//memulai session
session_start(); 

//cek adanya session, jika session ada maka akan di unset dan dilanjutkan dengan destroy session
if(ISSET($_SESSION['username'])) { 
UNSET($_SESSION['username']); 
} 
header("location: index.php"); 
session_destroy(); 
?>


signup.php

<form method="post" action="signup_process.php">
<pre><h2>Form Pendaftaran</h2>
Username <input name="username" type="text">
Password <input name="password" type="password">
  <input name="submit" value="Daftar" type="submit">
</pre>
</form>


signup_process.php

<?php 
include "config.php";

///mengambil data dari form
$username  = $_POST['username'];
$password  = $_POST['password'];
$password_md5 = md5($password);

//cek pengisian data
if($username=='' || $password==''){
echo "Data tidak lengkap<br--><a href=signup.php>Back</a>";

//jika data sudah lengkap, dilanjutkan input data ke database
}else{
$perintah   = "insert into users values ('$username', '$password_md5')"; 
$perintah_di_query = mysql_query($perintah); 

//Jika input data berhasil, dilanjutkan dengan pemberitahuan pendaftaran berhasil
if ($perintah_di_query) {
echo "Daftar berhasil, silakan <a href='index.php'>login</a>";

//jika input data gagal, dilanjutkan dengan pemberitahuan pendaftaran gagal
}else{
echo "Daftar gagal atau username telah terdaftar silakan <a href='signup.php'>Ulangi</a> atau <a href='login.php'>Login</a>";
}
}
?>



- Pengujian dilakukan dengan membuat sebuah user dan melakukan proses login, jika berhasil maka Home Page akan tampil.

1 Security Image Menggunakan PHP

Security image adalah bentuk perlindungan terhadap suatu form dari serangan SPAM. Sebagai contoh, anda mengisi formulir pendaftaran untuk mendapatkan account tertentu dan contoh lainnya adalah pengisian kotak komentar di halaman tertentu yang menggunakan security image.

Screenshot:


----------------------------------------------------------------------------









Cara kerjanya:
- Formulir akan menampilkan security code yang di generate oleh script PHP, apabila page tersebut di refresh maka security code akan  di generate lagi sehingga berubah codenya hal ini sangat berguna sekali untuk menangkal serangan spam.
- Setelah di submit, script php akan memvalidasi data anda dan mencocok kan security code yang telah anda masukkan apabila security code tidak sama, maka proses akan di batalkan apabila security code sama, maka proses akan dilanjutkan.

Berikut file-file yang akan digunakan:
- index.html
- action.php
- captcha.php
- DoradoHeadline.ttf

File index.html

<form action="action.php" method="post">
Pesan: 

<textarea cols="50" name="message" rows="10"></textarea>



<img src="captcha.php">

Security Code: <input id="security_code" name="security_code" type="text">

<input name="submit" value="Submit" type="submit"> 
</form>


File action.php

<?php   
session_start(); 
if( isset($_POST['submit'])) { 
   if(($_SESSION['security_code'] == $_POST['security_code']) &&  
(!empty($_SESSION['security_code'])) ) { 
      // masukkan script anda jika validasi benar 
      echo 'Terimakasih Pesan anda sudah muncul
"'.$_POST['message'].'"'; 
   echo "
<a href='index.html'>kembali</a>";
   } else { 
      // masukkan script anda jika validasi salah 
      echo 'Sorry, anda memasukkan security code yang salah
'; 
      include "index.html"; 
   } 
} else { 
      include "index.html"; 
    } 
?>


File captcha.php

<?php 
session_start();

class CaptchaSecurityImages {

   var $font = './DoradoHeadline.ttf';
   
   function generateCode($characters) {
      /* list all possible characters, similar looking characters and vowels have been removed */
      $possible = 'BCDFGHJKMNPQRSTVWXYZ23456789bcdfghjkmnpqrstvwxyz';
      $code = '';
      $i = 0;
      while ($i < $characters) {
         $code .= substr($possible, mt_rand(0, strlen($possible)-1), 1);
         $i++;
      }
      return $code;
   }

   function CaptchaSecurityImages($width='120',$height='40',$characters='6') {

      $code = $this->generateCode($characters);

      /* font size will be 75% of the image height */
      $font_size = $height * 0.50;
      $image = imagecreate($width, $height) or die('Cannot initialize new GD image stream');

      /* set the colours */
      $background_color = imagecolorallocate($image, 255, 255, 255);

      /* red text */
      //$text_color = imagecolorallocate($image, 220, 10, 10);

      /* black text */
      $text_color = imagecolorallocate($image, 1, 1, 1);

 $rndR = rand(98,198);
 $rndG = rand(98,198);
 $rndB = rand(98,198);
      $noise_color = imagecolorallocate($image, $rndR, $rndG, $rndB);

      /* generate random dots in background */
      for( $i=0; $i<($width*$height)/3; $i++ ) {
         imagefilledellipse($image, mt_rand(0,$width), mt_rand(0,$height), 1, 1, $noise_color);
      }

      /* generate random lines in background */
      for( $i=0; $i<($width*$height)/150; $i++ ) {
         imageline($image, mt_rand(0,$width), mt_rand(0,$height), mt_rand(0,$width), mt_rand(0,$height), $noise_color);
      }

      /* create textbox and add text */
      $textbox = imagettfbbox($font_size, 0, $this->font, $code) or die('Error in imagettfbbox function');
      $x = ($width - $textbox[4])/2;
      $y = ($height - $textbox[5])/2;
      imagettftext($image, $font_size, 0, $x, $y, $text_color, $this->font , $code) or die('Error in imagettftext function');

      // Show the image.
 if (function_exists('imagegif'))
 {
  header('Content-type: image/gif');
  imagegif($image);
 }
 else
 {
  header('Content-type: image/png');
  imagepng($image);
 }

 // Bail out.
 imagedestroy($image);

      $_SESSION['security_code'] = $code;

      die();


   }

}

$width = isset($_GET['width']) && $_GET['height'] < 600 ? $_GET['width'] : '132';
$height = isset($_GET['height']) && $_GET['height'] < 200 ? $_GET['height'] : '36';
$characters = isset($_GET['characters']) && $_GET['characters'] > 2 ? $_GET['characters'] : '6';

$captcha = new CaptchaSecurityImages($width,$height,$characters);

?>

3 Membuat Kalkulator Online

Buat file index.html dengan isi sbb:
<title>Kalkulator Online</title> 
 
 
<form name="form1" method="post" action="hitung.php"> 
<p>Operator matematika </p> 
<p> 
<input name="angka" id="angka" type="text"> 
<select name="operator" id="operator"> 
<option>+</option> 
<option>-</option> 
<option>*</option> 
<option>/</option> 
</select> 
<input name="angka2" id="angka2" type="text">  
<input name="Submit" value="Hitung" type="submit"> 
</p> 
</form> 
<form name="form2" method="post" action="hitung2.php"> 
<p>Konstanta matematika </p>
<p> 
<input name="angka" id="angka" type="text"> 
<select name="operator" id="operator"> 
<option>abs</option> 
<option>floor</option> 
      <option>round</option> 
      <option>decbin</option> 
      <option>bindec</option> 
      <option>decoct</option> 
      <option>octdec</option> 
      <option>dechex</option> 
      <option>hexdec</option> 
      <option>sin</option> 
      <option>cos</option> 
      <option>tan</option> 
      <option>log</option> 
      <option>sqrt</option> 
    </select> 
    <input name="Submit" value="Hitung" type="submit"> 
</p> 
  <p>Keterangan :</p> 
  <table width="100%" border="0"> 
    <tbody><tr> 
      <td>+</td> 
      <td>=</td> 
      <td>Tambah.</td> 
    </tr> 
    <tr> 
      <td>-</td> 
      <td>=</td> 
      <td>Kurang.</td> 
    </tr> 
    <tr> 
      <td>*</td> 
      <td>=</td> 
      <td>Kali.</td> 
    </tr> 
    <tr> 
      <td>/</td> 
      <td>=</td> 
      <td>Bagi.</td> 
    </tr> 
    <tr>
 <td width="4%">abs</td> 
      <td width="2%">=</td> 
      <td width="94%">Mencari nilai absolut .</td> 
</tr><tr> 
   <td>floor</td> 
   <td>=</td> 
   <td>Pembulatan nilai. </td> 
 </tr> 
<tr> 
      <td>round</td> 
      <td>=</td> 
      <td>Membulatkan angka di belakang koma. </td> 
    </tr> 
    <tr> 
      <td>decbin</td> 
      <td>=</td> 
      <td>Mengkonversi menjadi bilangan biner. </td> 
    </tr> 
    <tr> 
      <td>bindec</td> 
      <td>=</td> 
      <td>Mengkonversi menjadi bilangan desimal. (kebalikan dari decbin) </td> 
    </tr> 
    <tr> 
      <td>decoct</td> 
      <td>=</td> 
      <td>Mengkonversi menjadi bilangan oktal. </td> 
    </tr> 
    <tr> 
      <td>octdec</td> 
      <td>=</td> 
      <td>Mengkonversi menjadi bilangan desimal (kebalikan dari decoct) </td> 
    </tr> 
    <tr> 
      <td>dechex</td> 
      <td>=</td> 
      <td>Mengkonversi menjadi bilangan Hexadesimal. </td> 
    </tr> 
    <tr> 
      <td>hexdec</td> 
      <td>=</td> 
      <td>Mengkonversi menjadi bilangan desimal (kebalikan dari dechex). </td> 
</tr>
<tr> 
      <td>sin</td> 
      <td>=</td> 
      <td>sine</td> 
    </tr> 
    <tr> 
      <td>cos</td> 
      <td>=</td> 
      <td>cosine</td> 
    </tr> 
    <tr> 
      <td>tan</td> 
      <td>=</td> 
      <td>tangent</td> 
    </tr> 
    <tr> 
      <td>log</td> 
      <td>=</td> 
      <td>log</td> 
    </tr> 
<tr> 
      <td>sqrt</td> 
      <td>=</td> 
      <td>akar</td> 
    </tr> 
  </tbody></table> 
</form>


Selanjutnya file hitung.php
<?php  
$angka = $_POST['angka']; 
$angka2 = $_POST['angka2']; 
$operator = $_POST['operator']; 
if ($operator == '+'){ 
$hasil = $angka+$angka2;} 
if ($operator == '-'){ 
$hasil = $angka-$angka2;}
if ($operator == '*'){ 
$hasil = $angka*$angka2;} 
if ($operator == '/'){ 
$hasil = $angka/$angka2;} 
echo "$hasil"; 
echo "
<input type='button' value='kembali' onclick='history.back()'>";
?>


Dan yang terakhir file hitung2.php
<?php 
$angka = $_POST['angka']; 
$operator = $_POST['operator']; 
if ($operator == 'abs'){ 
$hasil = abs($angka);} 
if ($operator == 'floor'){ 
$hasil = floor($angka);} 
if ($operator == 'round'){ 
$hasil = round($angka);} 
if ($operator == 'decbin'){ 
$hasil = decbin($angka);} 
if ($operator == 'bindec'){ 
$hasil = bindec($angka);} 
if ($operator == 'decoct'){ 
$hasil = octdec($angka);} 
if ($operator == 'octdec'){ 
$hasil = octdec($angka);} 
if ($operator == 'dechex'){
$hasil = dechex($angka);} 
if ($operator == 'hexdec'){ 
$hasil = hexdec($angka);} 
if ($operator == 'sin'){ 
$hasil = sin($angka);} 
if ($operator == 'cos'){ 
$hasil = cos($angka);} 
if ($operator == 'tan'){ 
$hasil = tan($angka);} 
if ($operator == 'log'){ 
$hasil = log($angka);} 
if ($operator == 'sqrt'){ 
$hasil = sqrt($angka);} 
echo "$hasil"; 
echo "<br><input type='button' value='kembali' onclick='history.back()'>";
?>

0 Cisco Command Sumarry