agi yang belum memiliki fasilitas absensi yang terkomputerisasi, mari membuat
absensi sederhana dengan memanfaatkan shell script, PHP, dan database PostgreSQL.
Di bagian pertama, kita sudah membuat absensi dengan front end berbasis text (shell
script). Pada bagian terakhir ini, kita akan membahas front end berbasis web (PHP).
52
06/2006 INFOLINUX
if (!$_REQUEST[task])
{
echo
<FORM ACTION=absen.php?
task=check METHOD=post>
<TABLE BORDER=1>
<TR>
<TD COLSPAN=3 ALIGN=
center><B>ABSEN</TD>
</TR>
<TR>
<TD>User id</TD><TD><INPUT
TYPE=text NAME=
user_id SIZE=4></TD><TD>
<INPUT TYPE=submit
VALUE=OK></TD>
</TR>
</TABLE>
</FORM>
;
}
else
if ($_REQUEST[task] ==
check)
{
$user_id = strtoupper(trim(
$_POST[user_id]));
$q = select id_user from
ms_user where iduser=upper
($user_id);
$r = pg_query($conn, $q);
if (!pg_num_rows($r))
{
echo
User not found
 
<INPUT TYPE=button
VALUE=OK onclick=
location.href=\
absen.php\>
;
}
else
{
$q = select remark
from tr_absen where
date (time_in)=
current_date and
id_user=upper
($user_id);
$r = pg_query($conn, $q);
if (!pg_num_rows($r))
{
$c_act = true;
}
else
{
$l = pg_fetch_array($r,
0, PGSQL_ASSOC);
if ($l[remark] == )
$c_act = true;
}
if ($c_act == true)
{
echo
<FORM ACTION=absen.
php?task=process
METHOD=post>
<INPUT TYPE=hidden
www.infolinux.web.id
TUTORIAL ABSENSI
NAME=user_id VALUE=
$user_id>
<TABLE BORDER=1>
<TR>
<TD COLSPAN=3 ALIGN=
center>Action</TD>
</TR>
<TR>
<TD><INPUT TYPE=submit
NAME=action VALUE=
IN></TD>
<TD><INPUT TYPE=submit
NAME=action VALUE=
BREAK></TD>
<TD><INPUT TYPE=submit
NAME=action VALUE=
OUT></TD>
<TR>
</TABLE>
</FORM>
;
}
else
{
echo
<FORM ACTION=absen.
php?task=process
METHOD=post>
<INPUT TYPE=hidden
NAME=user_id VALUE=
$user_id>
<TABLE BORDER=1>
<TR>
<TD ALIGN=center>
Action</TD>
</TR>
<TR>
<TD><INPUT TYPE=submit
NAME=action VALUE=
BACK></TD>
<TR>
</TABLE>
</FORM>
;
}
}
}
else
if ($_REQUEST[task] ==
process)
{
$user_id = $_POST[user_id];
www.infolinux.web.id
echo
<TABLE BORDER=1>
<TR>
<TD ALIGN=center>
Welcome to Office<BR>
Have a nice day</TD>
</TR>
<TR>
<TD ALIGN=center>
<INPUT TYPE=button
VALUE=OK onclick=
location.href=\
absen.php\></TD>
<TR>
</TABLE>
;
break;
case OUT:
if ($in_before == false)
{
echo
<TABLE BORDER=1>
<TR>
<TD ALIGN=center>
ERROR: Please select
IN first</TD>
</TR>
<TR>
<TD ALIGN=center>
<INPUT TYPE=
button VALUE=OK
onclick=location.
href=\absen.php\
></TD>
<TR>
</TABLE>
;
}
else
{
$q = update tr_
absen set time_out=
now() where id_user=
upper($user_id) and
date(time_in)=
current_date ;
$r = pg_query($conn,
$q);
echo
<TABLE BORDER=1>
<TR>
<TD ALIGN=center>
See you later<BR>Have
a nice day</TD>
</TR>
<TR>
<TD ALIGN=center>
<INPUT TYPE=
button VALUE=OK
onclick=location.
href=\absen.php\
></TD>
<TR>
</TABLE>
;
}
break;
case BREAK:
if ($in_before == false)
{
echo
INFOLINUX 06/2006
53
TUTORIAL ABSENSI
<TABLE BORDER=1>
<TR>
<TD ALIGN=center>
ERROR: Please
select IN first
</TD>
</TR>
<TR>
<TD ALIGN=center>
<INPUT TYPE=button
VALUE=OK onclick=
location.href=\
absen.php\></TD>
<TR>
</TABLE>
;
}
else
{
echo
<FORM ACTION=absen.
php?task=break_confirm
METHOD=post>
<INPUT TYPE=hidden
NAME=user_id VALUE=
$user_id>
<TABLE BORDER=1>
<TR>
<TD COLSPAN=2
ALIGN=center>
Reason</TD>
</TR>
<TR>
<TD><INPUT TYPE=
text NAME=reason>
</TD>
<TD><INPUT TYPE=
submit VALUE=
OK></TD>
<TR>
</TABLE>
</FORM>
;
}
break;
case BACK:
echo
<FORM ACTION=absen.
php?task=back METHOD=
post>
<INPUT TYPE=hidden
NAME=user_id VALUE=
$user_id>
54
06/2006 INFOLINUX
<TABLE BORDER=1>
<TR>
<TD COLSPAN=2 ALIGN=
center>Confirmation
</TD>
</TR>
<TR>
<TD><INPUT TYPE=submit
NAME=confirm VALUE=
Yes></TD>
<TD><INPUT TYPE=submit
NAME=confirm VALUE=
No></TD>
<TR>
</TABLE>
</FORM>
;
break;
}
}
else
if ($_REQUEST[task] ==
break_confirm)
{
$user_id =
$_POST[user_id];
$reason = $_POST[reason];
echo
<FORM ACTION=absen.
php?task=break METHOD=
post>
<INPUT TYPE=hidden
NAME=user_id VALUE=
$user_id>
<INPUT TYPE=hidden NAME=
reason VALUE=$reason>
<TABLE BORDER=1>
<TR>
<TD COLSPAN=2 ALIGN=
center>Confirmation</TD>
</TR>
<TR>
<TD><INPUT TYPE=submit
NAME=confirm VALUE=
Yes></TD>
<TD><INPUT TYPE=submit
NAME=confirm VALUE=
No></TD>
<TR>
</TABLE>
</FORM>
;
}
else
if ($_REQUEST[task] ==
break)
{
$user_id =
$_POST[user_id];
$reason = $_POST[reason];
$confirm = $_POST
[confirm];
if ($confirm == No)
{
echo
<TABLE BORDER=1>
<TR>
<TD ALIGN=center>Break
cancelled</TD>
</TR>
<TR>
<TD ALIGN=center>
<INPUT TYPE=button
VALUE=OK onclick=
location.href=\absen.
php\></TD>
<TR>
</TABLE>
;
}
else
if ($confirm == Yes)
{
$q = update tr_absen
set break_count=
break_count+1,
remark=break:$reason
where id_user=
upper($user_id) and
date (time_in)=
current_date ;
$r = pg_query($conn, $q);
echo
<TABLE BORDER=1>
<TR>
<TD ALIGN=center>Take
your time</TD>
</TR>
<TR>
<TD ALIGN=center>
<INPUT TYPE=button
VALUE=OK onclick=
www.infolinux.web.id
TUTORIAL ABSENSI
location.href=\absen.
php\></TD>
<TR>
</TABLE>
?>
if ($confirm == Yes)
{
$q = update tr_absen
set remark= where
id_user=upper(
$user_id) and date
(time_in)=current_date ;
$r = pg_query($conn, $q);
;
}
}
else
if ($_REQUEST[task] ==
back)
{
$user_id =
$_POST[user_ id];
$confirm = $_POST
[confirm];
if ($confirm == No)
{
echo
<TABLE BORDER=1>
<TR>
<TD ALIGN=center>Take
your time</TD>
</TR>
<TR>
<TD ALIGN=center>
<INPUT TYPE=button
VALUE=OK onclick=
location.href=\absen.
php\></TD>
<TR>
</TABLE>
;
}
else
www.infolinux.web.id
echo
<TABLE BORDER=1>
<TR>
<TD ALIGN=center>
Welcome back</TD>
</TR>
<TR>
<TD ALIGN=center>
<INPUT TYPE=button
VALUE=OK onclick=
location.href=\absen.
php\></TD>
<TR>
</TABLE>
;
}
}
echo
</CENTER>
</BODY>
</HTML>
;
Laporan
Laporan akan kita jalankan di web dan akan
kita simpan dengan nama laporan.php. Berikut ini adalah source code dari laporan.php:
<?
// (c) Noprianto, Feb 2006
// v0.1 BSD
INFOLINUX 06/2006
55
TUTORIAL ABSENSI
session_start();
ob_start();
$conn = pg_connect(dbname=absen
user=nop);
echo
<HTML>
<HEAD>
<TITLE>Laporan Absensi</TITLE>
</HEAD>
<BODY>
;
if (!session_is_registered
(login))
{
if (!$_REQUEST[task] )
{
echo
<FORM ACTION=laporan.
php?task=login METHOD=
post>
<TABLE BORDER=1>
<TR><TD COLSPAN=2 ALIGN=
center>Login</TD></TR>
<TR>
<TD>User id</TD><TD><INPUT
TYPE=text
NAME=user_id></TD>
</TR>
<TR>
<TD>Password</TD><TD><INPUT
TYPE=password
NAME=password></TD>
</TR>
<TR>
<TD> </TD><TD><INPUT
TYPE=submit
VALUE=login></TD>
</TR>
</TABLE>
</FORM>
;
}
else
if ($_REQUEST[task] ==
56
06/2006 INFOLINUX
login)
{
$user_id =
$_POST[user_id];
$password =
$_POST[password];
$q = select count(*) as
found from ms_user where
id_user=upper($user_id)
and password=md5
($password) and
id_user<> and password
<> ;
$r = pg_query($conn, $q);
$l = pg_fetch_array($r, 0,
PGSQL_ASSOC);
$found = $l[found];
if ($found == 1)
{
session_register
(login);
$_SESSION[login] =
$user_id;
}
header(Location:
laporan.php);
}
}
else
{
if (!$_REQUEST[task] )
{
$user_id = $_SESSION
[login];
echo Welcome to Laporan
Absen, $user_id
<A HREF=laporan.php?
task=logout>logout</A>
<HR> <BR>;
$today = date(Y-m-d);
echo
<FORM ACTION=laporan.
php?task=report
METHOD=post>
<TABLE BORDER=1>
<TR>
<TD>Report from</TD><TD>
<INPUT TYPE=text
NAME=from VALUE=$today>
</TD>
<TD>to</TD><TD><INPUT
TYPE=text name=to
VALUE=$today></TD>
</TR>
<TR>
<TD VALIGN=top>
Sort
<BR>
<INPUT TYPE=radio
NAME=sort_type VALUE=A
checked>asc<BR>
<INPUT TYPE=radio
NAME=sort_type VALUE=D>
desc<BR>
</TD>
<TD COLSPAN=3>
<INPUT TYPE=radio
NAME=sort_task
VALUE=earliest_in
checked>Earlist IN<BR>
<INPUT TYPE=radio
NAME=sort_task
VALUE=latest_out>
Latest OUT<BR>
<INPUT TYPE=radio
NAME=sort_task
VALUE=break_ most>
BREAK most<BR>
</TD>
</TR>
<TR>
<TD> </TD>
<TD COLSPAN=3>
<INPUT TYPE=reset
VALUE=reset>
<INPUT TYPE=submit
VALUE=create report>
</TD>
</TR>
</TABLE>
</FORM>
;
}
else
if ($_REQUEST[task] ==
report)
{
$user_id = $_SESSION
[login];
echo Welcome to Laporan
Absen, $user_id
<A HREF=laporan.php?task=
logout>logout</A> <HR>
www.infolinux.web.id
TUTORIAL ABSENSI
<BR>;
PGSQL_ASSOC);
echo <TR>;
echo <TD> . $l[id_
user] . </TD>;
echo <TD> .
$l[time_in] .
</TD>;
echo <TD> .
$l[time_out] .
</TD>;
echo <TD> .
$l[break_count] .
</TD>;
echo </TR>;
$from = $_POST[from];
$to = $_POST[to];
$sort_type =
$_POST[sort_type];
$sort_task =
$_POST[sort_task];
$q = select * from
tr_absen where
date(time_in)>=$from and
date(time_out)<=$to
order by id_user ;
switch ($sort_task)
{
case earliest_in:
$q .= , time_in ;
break;
case latest_out:
$q .= , time_out ;
break;
case break_most:
$q .= ,
break_count ;
break;
}
if ($sort_task != )
{
switch ($sort_type)
{
case A:
$q .= asc;
break;
case D:
$q .= desc;
break;
}
}
echo <I><FONT SIZE=-1>
$q</FONT></I>;
echo <TABLE BORDER=1>;
echo <TH>user</TH><TH>date
in</TH><TH>date out</TH>
<TH>break count</TH>;
$r = pg_query($conn, $q);
if (pg_num_rows($r) > 0)
{
for ($i = 0; $i <
pg_num_rows($r); $i++)
{
$l = pg_fetch_array
($r, $i,
www.infolinux.web.id
}
}
echo </TABLE>;
}
else
if ($_REQUEST[task] ==
logout)
{
session_unset();
session_destroy();
header(Location: laporan.
php);
}
}
echo
</BODY>
</HTML>
;
ob_end_flush();
?>
Lebih lanjut
Apabila kita lihat, sistem absensi ini memiliki kekurangan yang paling menonjol yaitu
bahwa siapa saja bisa mengabsensikan siapa
saja. Baik absen masuk, ijin ataupun keluar.
Apabila diinginkan, kita bisa saja meminta user untuk memasukkan password
sebelum memilih aksi yang diinginkan (IN,
OUT, BREAK, BACK). User satu tetap bisa
mengabsensikan user lain apabila diinginkan, namun, bagi user yang tidak memberitahu passwordnya kepada user lain, user
lain tidak bisa sembarangan mengabsensikan, termasuk izin.
Apabila identifikasi yang menjadi masalah seperti dibahas sebelumnya, kita bisa
saja mengintegrasikan finger print reader
ataupun teknologi biometrik lain.
Kekurangan lain dari sistem ini adalah
struktur data flat tr_absen yang digunakan.
Kita juga tidak mencatat detil izin yang dilakukan. Begitupun dengan fasilitas laporan
dan pengurutan yang sangat sederhana dan
terbatas.
Tentunya, aplikasi ini sangat perlu disempurnakan apabila ingin digunakan.
Kekurangan lain yang juga mungkin minor adalah fokus pada front end berbasis
web. Tentu akan lebih mudah digunakan
apabila tempat user memberi input selalu
dalam keadaan terfokus.
Demikianlah pembahasan kita tentang
pembuatan aplikasi absensi. Selamat mencoba!
Noprianto [noprianto@infolinux.co.id]
INFOLINUX 06/2006
57
IKLAN
SEMINAR BAJAU
IKLAN OZONE
TUTORIAL SSH
Beberapa Langkah
Meningkatkan Keamanan SSH
ebagai salah satu service yang paling banyak digunakan untuk keperluan remote, ada
baiknya tingkat keamanan SSH lebih ditingkatkan. Dengan beberapa langkah yang
dapat dilakukan dengan mudah, keamanan suatu server dapat lebih terjamin. Pada
artikel ini, kami akan menjelaskan empat cara untuk mengamankan SSH server.
60
06/2006 INFOLINUX
operasi Linux, memiliki cukup banyak konfigurasi yang dapat digunakan untuk meningkatkan keamanan.
Ada beberapa langkah yang dapat kita
lakukan untuk mengamankan SSH server.
Beberapa langkah yang dapat dilakukan diantaranya sebagai berikut:
Disable akses login SSH ke user root.
Disable password logins dengan langsung mengubah setting PasswordAuthentication yang terdapat pada file
konfigurasi sshd.
Menjalankan service sshd pada port
yang berbeda.
Menginstalasi DenyHosts.
Untuk mempermudah pemahaman, silahkan baca penjelasan mengenai keempat
metode pengamanan SSH yang akan InfoLINUX jelaskan pada artikel ini.
Persiapan
Paket OpenSSH, biasanya sudah disertakan
dalam CD distro yang Anda gunakan. Sebagai
bahan uji coba pembuatan artikel ini, InfoLINUX menggunakan distro Debian Sarge 3.1
sebagai pilihan distronya. Meski demikian,
langkah ini juga dapat Anda terapkan dengan mudah di berbagai distro lainnya.
Untuk melihat apakah paket OpenSSH
sudah terinstallasi atau belum di paket
Debian Sarge, cukup mengetikkan perintah
sebagai berikut:
# dpkg -l | grep ssh
ii ssh
3.8.1p1-8.sarg
menjadi:
PermitRootLogin no
www.infolinux.web.id
TUTORIAL SSH
Langkah berikutnya adalah testing konfigurasi yang telah Anda lakukan. Sebagai
contoh komputer yang kita konfigurasi
memiliki IP 192.168.2.1. Dari komputer
yang lainnya, tes untuk login ke SSH server
dengan login sebagai user root. Ketika ditanyakan password root Anda, masukkan
dengan password root yang terdapat pada
sistem Anda.
$ ssh root@192.168.2.1
Password:
Password:
Password:
Permission denied
(publickey,keyboard-interactive).
Instalasi DenyHosts
Setelah terbuka, edit pada bagian
Port 22
menjadi :
Port 9922
# vim /etc/ssh/sshd_config
Jika Anda sudah tidak melihat lagi service SSH berjalan pada port 22, lakukan
pengujian untuk mengakses ke ssh server
tersebut. Untuk mengakses ssh server yang
sudah berjalan pada port 9922, Anda memerlukan option -p pada ssh client. Misal:
PasswordAuthentication no
Setelah diubah, jangan lupa untuk merestart kembali service SSH server Anda.
# /etc/init.d/ssh restart
www.infolinux.web.id
# vim /etc/ssh/sshd_config
Disable PasswordAuthentication
Menggunakan DenyHosts
# nmap localhost
$ ssh -p 9922
supriyanto@192.168.2.1
(Note: Ketik dalam 1 baris syntax)
INFOLINUX 06/2006
61
TUTORIAL SSH
Setelah selesai menginstalasi paket python dan python-dev, copy file DenyHosts2.4b.tar.gz ke direktori /tmp, lalu lakukan
proses ekstrak file tersebut.
# tar -xzvf DenyHosts-2.4b.tar.gz
# cd denyhost
# python setup.py install
Jika instalasi berjalan dengan baik, DenyHosts akan terinstalasi pada direktori
/usr/share/denyhosts.
Konfigurasi DenyHosts
Setelah DenyHosts terinstalasi dengan baik,
langkah berikutnya adalah mengonfigurasi
DenyHosts. Sekarang kita akan membuat
file /usr/share/denyhosts/denyhosts.cfg.
Untuk membuatnya, Anda cukup mengcopy-nya dari file konfigurasi /usr/share/
denyhosts/denyhosts.cfg-dist.
Gambar 4. Contoh Host yang tidak bisa mengakses SSH server setelah terblok.
#
# SuSE:
#SECURE_LOG = /var/log/messages
#
# Mac OS X (v10.4 or greater #
also refer to:
http://www.
denyhosts.net/faq.html#macos
#SECURE_LOG = /private/var/log/
asl.log
#
# Mac OS X (v10.3 or earlier):
#SECURE_LOG=/private/var/log/
system.log
..................................
..................................
# Most operating systems:
HOSTS_DENY = /etc/hosts.deny
..................................
..................................
WORK_DIR = /usr/share/denyhosts/
data
..................................
..................................
# Redhat/Fedora:
#LOCK_FILE = /var/lock/subsys/
denyhosts
#
# Debian
LOCK_FILE = /var/run/denyhosts.pid
#
# Misc
#LOCK_FILE = /tmp/denyhosts.lock
..................................
..................................
# cd /usr/share/denyhosts
# cp denyhosts.cfg-dist denyhosts.
cfg
Selanjutnya, kita perlu mengedit file denyhosts.cfg, sesuai dengan kondisi sistem
yang kita miliki. Sebagai contoh dalam artikel ini, kami mengubah beberapa parameter pada file denyhosts.cfg, pada bagian
berikut:
# vi /usr/share/denyhosts/
denyhosts.cfg
..................................
..................................
# Redhat or Fedora Core:
#SECURE_LOG = /var/log/secure
#
# Mandrake, FreeBSD or OpenBSD:
SECURE_LOG = /var/log/auth.log
62
06/2006 INFOLINUX
www.infolinux.web.id
TUTORIAL SSH
trol. Untuk membuat file tersebut, cukup
kita gunakan dari file sample script /usr/
share/denyhosts/daemon-control-dist.
# cd /usr/share/denyhosts
# cp daemon-control-dist daemoncontrol
Berikutnya kita akan menciptakan symbolic links agar DenyHosts dapat berjalan
secara otomatis pada saat sistem di-restart.
# cd /etc/init.d
# ln -s /usr/share/denyhosts/
daemon-control denyhosts
# update-rc.d denyhosts defaults
www.infolinux.web.id
INFOLINUX 06/2006
63
TUTORIAL HARDWARE
utorial ini akan membahas langkah-langkah apa yang dapat dilakukan untuk
mendeteksi hardware di Linux. Terdapat tool-tool yang bisa memudahkan kita untuk
mengusahakan agar hardware kita bekerja dengan baik di Linux. Saat ini, Linux cukup
ramah terhadap berbagai hardware.
Linux sebenarnya merupakan sistem operasi yang plug and play. Untuk hardware yang
sudah dikenali Linux, kita bisa menancapkan hardware tersebut dan setelah modul
kernel yang bersesuaian dijalankan, maka
hardware tersebut segera bisa digunakan.
Tanpa ada prosedur yang merepotkan.
Memang, kalau kita harus jujur, Linux
belum mampu dalam mengenal semua
hardware yang ada di pasaran. Sebagian
besar produsen hardware memang belum
memaketkan driver-nya untuk sistem
operasi Linux. Developer kernel pun harus pontang-panting mengusahakan driver
perangkat tersebut. Memang tidak semua
produsen. Ada juga yang telah memaketkan
driver untuk Linux, atau beberapa perusahaan bahkan menyumbangkan dana agar
hardware-nya dapat bekerja di Linux.
Dari sisi distribusi Linux, berbagai distribusi telah menyediakan berbagai cara agar
hardware dapat digunakan semudah mungkin di Linux (secara otomatis). Namun, pendeteksian dan konfigurasi otomatis tidak
selalu dapat dijamin. Kadang bisa, kadang
tidak bisa.
Sebagai user, kita perlu mengetahui caracara mendeteksi dan mengonfigurasi hardware secara manual. Ada beberapa alasan:
Kita mungkin tidak sempat mengikuti
perkembangan dukungan hardware di
Linux. Sebenarnya, bisa saja hardware
didukung, namun fitur tersebut oleh distribusi yang kita gunakan tidak dikompilasi ke dalam kernel/modul kernel.
64
06/2006 INFOLINUX
Dukungan kernel
Hardware didukung pada level kernel. Oleh
karena itu, dukungan pada kernel harus
diaktifkan terlebih dahulu agar hardware
tersebut bisa digunakan. Bentuk aktifasi
bisa dengan mengompilasi ke dalam kernel,
ataupun mengompilasi dalam bentuk modul
kernel. Cara yang kedua ini lebih disukai saat
ini karena lebih modular. Hanya dukungan
yang diperlukan saja yang diaktifkan.
Apabila kita tahu bahwa hardware tertentu telah didukung di kernel, namun ti-
www.infolinux.web.id
TUTORIAL HARDWARE
Apabila dukungan tidak diaktifkan sama
sekali, maka kita perlu mengkompilasi
kernel/modul kernel tersebut. Kompilasi kernel berada di luar cakupan tutorial
ini. Kompilasi modul kernel akan dibahas untuk driver yang belum dimasukkan pada kernel (lihat poin setelah ini).
Apabila dukungan tidak dikompilasi dan
tidak tersedia pula pada level kernel,
maka barangkali driver tersebut memiliki lisensi yang tidak bisa diterima oleh
kernel ataupun distribusi sehingga tidak
dimasukkan. Kita akan membahasnya
kemudian, di bagian lain.
www.infolinux.web.id
CONFIG_PCMCIA_AXNET=m
CONFIG_ARCNET_COM20020_CS=m
$ cd /lib/modules/`uname -r`
$ pwd
/lib/modules/2.6.8-2-386/kernel
$ pwd
/lib/modules/2.6.8-2-386
$ ls -al /lib/modules/2.6.8-2-386/
kernel/
total 3
drwxr-xr-x 10 root root 240
2005-12-11 05:44 .
drwxr-xr-x
6 root root 496
2006-03-19 11:51 ..
drwxr-xr-x
3 root root
72
2005-12-11 05:44 arch
drwxr-xr-x
2 root root 568
2006-03-15 11:14 crypto
drwxr-xr-x 31 root root 760
INFOLINUX 06/2006
65
TUTORIAL HARDWARE
2005-12-11
drwxr-xr-x
2006-03-15
drwxr-xr-x
2006-03-15
drwxr-xr-x
2005-12-11
drwxr-xr-x
2006-03-15
drwxr-xr-x
2006-03-15
05:44 drivers
42 root root 1136
11:14 fs
3 root root 144
11:14 lib
30 root root 744
05:44 net
2 root root 144
11:14 security
11 root root 296
11:14 sound
66
06/2006 INFOLINUX
2006-03-15
drwxr-xr-x
2006-03-15
drwxr-xr-x
2005-12-11
drwxr-xr-x
2006-03-15
drwxr-xr-x
2005-12-11
drwxr-xr-x
2005-12-11
drwxr-xr-x
2005-12-11
drwxr-xr-x
2006-03-15
drwxr-xr-x
2006-03-15
drwxr-xr-x
2006-03-15
drwxr-xr-x
2005-12-11
drwxr-xr-x
2006-03-15
drwxr-xr-x
2006-03-15
drwxr-xr-x
2006-03-15
drwxr-xr-x
2006-03-15
drwxr-xr-x
2005-12-11
drwxr-xr-x
2006-03-15
drwxr-xr-x
2006-03-15
11:14 ieee1394
9 root root 360
11:14 input
13 root root 312
05:44 isdn
2 root root 416
11:14 md
6 root root 144
05:44 media
4 root root
96
05:44 message
3 root root
72
05:44 misc
6 root root 472
11:14 mtd
16 root root 3024
11:14 net
2 root root 184
11:14 parport
3 root root
72
05:44 pci
2 root root 256
11:14 pcmcia
6 root root 2272
11:14 scsi
2 root root
80
11:14 serial
2 root root 136
11:14 telephony
13 root root 312
05:44 usb
9 root root 656
11:14 video
2 root root 136
11:14 w1
-rw-r--r-2005-08-16
-rw-r--r-2005-08-16
-rw-r--r-2005-08-16
-rw-r--r-2005-08-16
-rw-r--r-2005-08-16
-rw-r--r-2005-08-16
Size
68388
229892
10408
17796
11272
12944
4236
6680
17584
Used by
5
8
0
4
1
0
0
0
1
5132
9740
61048
33348
37320
0
0
2
1
2
54992
Program ini sebenarnya membaca informasi modul yang dijalankan dari proc filesystem, tepatnya pada file /proc/modules.
Berikut ini adalah contoh isi file-nya:
$ head /proc/modules
i830 68388 5 - Live 0xeffaa000
ipv6 229892 8 - Live 0xeffd2000
lp 10408 0 - Live 0xeff83000
ds 17796 4 - Live 0xeff8a000
binfmt_misc 11272 1 - Live
0xeff7f000
thermal 12944 0 - Live 0xeff7a000
www.infolinux.web.id
TUTORIAL HARDWARE
fan 4236 0 - Live 0xeff3f000
button 6680 0 - Live 0xefe8f000
processor 17584 1 thermal, Live
0xeff43000
ac 5132 0 - Live 0xefe92000
Sebagai catatan, modprobe akan mempergunakan file modules.dep (yang tersimpan pada direktori modul kernel), yang
dihasilkan oleh program depmod (akan
dibahas kemudian).
www.infolinux.web.id
INFOLINUX 06/2006
67
TUTORIAL HARDWARE
Untuk membuat file ini, program depmod bisa dipergunakan. Berikut ini adalah
contoh penggunaan program depmod:
# depmod -a
68
06/2006 INFOLINUX
(rev 03)
0000:00:1d.2 USB Controller: Intel
Corp. 82801DB/DBL/DBM (ICH4/ICH4L/ICH4-M) USB UHCI Controller #3
(rev 03)
0000:00:1d.7 USB Controller: Intel
Corp. 82801DB/DBM (ICH4/ICH4-M)
USB 2.0 EHCI Controller (rev 03)
0000:00:1e.0 PCI bridge: Intel
Corp. 82801 PCI Bridge (rev 83)
0000:00:1f.0 ISA bridge: Intel
Corp. 82801DBM LPC Interface
Controller (rev 03)
0000:00:1f.1 IDE interface: Intel
Corp. 82801DBM (ICH4) Ultra ATA
Storage Controller (rev 03)
0000:00:1f.3 SMBus: Intel Corp.
82801DB/DBL/DBM (ICH4/ICH4-L/ICH4M) SMBus Controller (rev 03)
0000:00:1f.5 Multimedia audio
controller: Intel Corp. 82801DB/
DBL/DBM (ICH4/ICH4-L/ICH4-M) AC97
Audio Controller (rev 03)
0000:00:1f.6 Modem: Intel Corp.
82801DB/DBL/DBM (ICH4/ICH4-L/ICH4M) AC97 Modem Controller (rev 03)
0000:02:04.0 CardBus bridge:
Texas Instruments PCI1520 PC card
Cardbus Controller (rev 01)
0000:02:04.1 CardBus bridge:
Texas Instruments PCI1520 PC card
Cardbus Controller (rev 01)
0000:02:0a.0 Ethernet controller:
Realtek Semiconductor Co., Ltd.
RTL-8139/8139C/8139C+ (rev 10)
Floppy
Framebuffer
Joystick
Isdn
Printer
Braille
Partition
Isapnp
Hub
Pcmcia
Dsl
Disk
Monitor
Keyboard
Modem
Tv
Sys
Usb-ctrl
Ide
Memory
Pcmcia-ctrl
All
Network
Camera
Chipcard
Storage-ctrl
Dvb
Bios
Usb
Scsi
Smp
Wlan
reallyall
# hwinfo --short
cpu:
Intel(R) Celeron(R) CPU
2.50GHz, 2500 MHz
keyboard:
/dev/input/event0
AT
Translated Set 2 keyboard
mouse:
/dev/input/mice
SynPS/2
Synaptics TouchPad
graphics card:
Acer Incorporated [ALI]
855 GM
Acer Incorporated [ALI]
855 GM
sound:
Acer Incorporated [ALI]
82801DB AC97 Audio Controller
storage:
Floppy disk controller
Acer Incorporated
[ALI] 82801DBM Ultra ATA Storage
Controller
network:
Acer Incorporated [ALI]
RTL-8139/8139C/8139C+
modem:
/dev/ttySL0
Acer
Incorporated [ALI] 82801DB AC97
Modem Controller
network interface:
eth0
Ethernet
network interface
lo
Loopback
network interface
sit0
Network
Interface
...
...
...
www.infolinux.web.id
TUTORIAL HARDWARE
Untuk mendeteksi hardware tertentu,
berikanlah opsi sesuai jenis hardware.
Sebagai contoh:
# hwinfo --netcard --short
network:
Acer Incorporated [ALI]
RTL-8139/8139C/8139C+
# hwinfo --modem --short
modem:
/dev/ttySL0
Acer
Incorporated [ALI] 82801DB AC97
Modem Controller
www.infolinux.web.id
INFOLINUX 06/2006
69
ebuah CD/DVD dapat berisi beberapa Live CD yang dapat dipilih saat booting.
Tutorial ini menunjukkan cara praktis menggabungkan beberapa Live CD ke dalam
satu CD/DVD dan mengedit konfigurasi boot loadernya. Langkah-langkah ini
disusun berdasarkan pengalaman penulis sebagai developer SLAMPP Live CD solusi
sederhana Linux untuk server rumah siap pakai.
Saat ini para pengguna Linux, baik pemula
maupun yang telah berpengalaman, paling
tidak pernah men-download atau mencoba
satu distro Linux yang dapat dijalankan dari
sebuah CD atau DVD. Teknologi Live CD
yang mendasarinya juga semakin hari semakin berkembang pesat. Satu hal yang dulunya
di luar bayangan kebanyakan orang, menjalankan sistem operasi Linux langsung dari CD
atau DVD, sekarang impian itu telah menjadi
kenyataan. Live CD Linux telah merambah
kehidupan manusia zaman sekarang.
70
06/2006 INFOLINUX
www.infolinux.web.id
# wget http://www.nautopia.
net/estaticos/descargas/
customlivecd.zip
c. SLAX 5.1.0:
# wget http://merlin.fit.
vutbr.cz/mirrors/slax/SLAX5.0.x/slax-5.1.0.iso
Langkah-langkah
1. Men-download paket customlivecd asli
Nautopia.net dengan wget seperti ini:
www.infolinux.web.id
INFOLINUX 06/2006
71
puppy/menu.lst, /dvd/boot/grub/slax/
menu.lst dan sesuaikan dengan situasi di
atas. Berkas menu.lst ini yang akan digunakan grub untuk memanggil dan menjalankan distro-distro yang ada di CD.
7. Semua berkas di langkah 5 dan 6 harus
disimpan setelah diedit.
8. Sekarang kita sudah mendekati langkah
pembuatan berkas iso yang baru yang
berisikan semua distro di atas. Untuk itu
diperlukan sebuah skrip yang memanfaatkan aplikasi mkisofs yang terdapat
di hampir seluruh distro. Aplikasi ini biasanya terdapat di dalam paket cdrtools,
atau dapat juga diinstal sendiri. Bukalah
sebuah editor teks dan buat skrip seperti
di bawah ini:
#!/bin/bash
# Create bootable ISO from files
in curent directory.
mkisofs -o $1 -v -J -R -D -A
$CDLABEL -V $CDLABEL \
-no-emul-boot -boot-info-table
-boot-load-size 4 \
-b boot/grub/stage2_eltorito .
CDLABEL=LiveCDCollection
if [ $1 = -o $1 =
--help -o $1 = -h ]; then
echo This script will create
bootable ISO from files in
curent directory.
echo Current directory must
be writable.
echo example: $0
/tmp/livecd.iso
exit
fi
72
06/2006 INFOLINUX
Kesimpulan
Mengkompilasi sebuah koleksi Live CD
tidaklah sesulit yang dibayangkan kebanyakan orang. Walaupun pada awalnya akan sedikit membingungkan, akan tetapi dengan
sedikit kesabaran dan ketelatenan, koleksi
Live CD yang diharapkan dapat diperoleh
juga. Hadirnya teknologi Live CD di kehidupan kita saat ini jelas telah memberikan
banyak dampak positif. Pilihan diberikan
kepada kita untuk memilih distro mana
yang sesuai dengan keperluan dan selera.
Setiap distro Live CD yang ada memiliki
kelebihan masing-masing, yang jika dijadikan satu akan mempermudah dan mendukung aktivitas kita sehari-hari. Itulah tujuan
akhir yang hendak dicapai dalam artikel ini.
Akhir kata, selamat mencoba dan selamat
datang di era mobilitas Live CD!
Kemas Yunus Antonius [kyantonius@kyantonius.com]
www.infolinux.web.id
TUTORIAL SELINUX
Mengamankan Linux
dengan SELinux
emua UNIX standar yang memenuhi POSIX (termasuk juga Linux) hanya mendukung
pembatasan akses berdasarkan user id dan group. Ternyata pembatasan akses
berdasarkan user dan group ini sering dirasa tidak cukup. Untuk itulah para hacker
mengembangkan SELinux.
74
06/2006 INFOLINUX
www.infolinux.web.id
TUTORIAL SELINUX
bas memilih server daemon apapun (misalnya Sendmail yang terkenal kurang aman,
namun menurut saya sangat fleksibel) dan
membatasi akses daemon itu agar tidak
menimbulkan masalah security.
Ada beberapa hal yang tidak bisa diatasi
oleh SELinux, misalnya SELinux tidak
mencegah modifikasi data yang memang
diijinkan program, misalnya dalam kasus
SQL Injection yang mengubah data. SQL
Injection merupakan bug yang memungkinkan seseorang memodifikasi statement
SQL dan mengubah isi basis data. Perubahan isi basis data tidak bisa dicegah oleh
SELinux, tapi SELinux mampu mencegah
SQL Injection yang berusaha mengeksekusi program lain atau menulis ke file lain
(misalnya instruksi dump database).
SELinux tidak menangani enkripsi. Jadi
jika Anda memiliki data penting, SELinux
tidak mencegah data Anda diakses orang
lain. Bagi Anda pengguna laptop, menggunakan filesystem dengan enkripsi sangat
disarankan.
www.infolinux.web.id
Konsep dasar
Secara teknis dikatakan UNIX standar
mendukung discretionary access control
(DAC), yang artinya pembatasan hak akses ada pada pemilik objek, sedangkan
SELinux mendukung mandatory access con-
Website SELinux.
INFOLINUX 06/2006
75
TUTORIAL SELINUX
konsep-konsep baru yang meliputi konsep
subjek, predikat, objek, konsep security context, konsep objek transien dan persisten,
serta terakhir konsep keputusan akses (access decission).
Security context
Sebenarnya kita bisa saja membuat sebuah
aturan mendetail untuk setiap user dan
program yang ada di sistem, tapi tentunya
hal tersebut tidak efisien karena akan memakan waktu lama untuk mendefinisikan
76
06/2006 INFOLINUX
www.infolinux.web.id
TUTORIAL SELINUX
00:00:00 httpd
system_u:system_r:httpd_t
00:00:00 httpd
system_u:system_r:httpd_t
00:00:00 httpd
system_u:system_r:httpd_t
00:00:00 httpd
system_u:system_r:httpd_t
00:00:00 httpd
system_u:system_r:httpd_t
00:00:00 httpd
system_u:system_r:httpd_t
00:00:00 httpd
system_u:system_r:httpd_t
00:00:00 httpd
2529 ?
2530 ?
2531 ?
2532 ?
2533 ?
Keputusan akses
2534 ?
2535 ?
Tapi, bagaimana sebenarnya relasi antara kedua konteks tersebut? Apakah suatu
proses dengan konteks tertentu pasti boleh
mengakses file dengan konteks yang sama?
Hubungan tersebut diatur dalam file konfigurasi SELinux. Misalnya, isi sebagian file
policy.conf di Fedora Core 4 adalah sebagai
berikut:
allow httpd_t httpd_sys_content_t:
dir { read getattr lock search
ioctl };
allow httpd_t httpd_sys_content_t:
file { read getattr lock ioctl };
allow httpd_t httpd_sys_content_t:
lnk_file { getattr read };
www.infolinux.web.id
Keputusan transisi
Keputusan transisi di Unix cukup mudah,
yaitu semua proses akan selalu melahirkan
proses yang memiliki hak sesuai dengan
dirinya (kecuali jika proses tersebut berasal dari file setuid), sedangkan semua file
yang diciptakan akan memiliki user dan
group sama dengan hak proses. Keputusan transisi di SELinux sedikit lebih rumit
dari itu.
Secara default pada SELinux, proses
yang baru akan memiliki konteks yang
sama dengan proses lama, kecuali file
konfigurasi SELinux menyatakan bahwa
transisi domain harus terjadi. Jika file konfigurasi menyatakan bahwa transisi harus
terjadi, maka proses yang baru akan memiliki domain yang berbeda dengan parent.
Pada penciptaan file, secara default
konteks file sama dengan konteks direktori (dengan attribut user sesuai dengan user
yang menciptakannya), namun hal inipun
dapat diubah dengan menggunakan file
konfigurasi SELinux.
DAC vs MAC
Linux memakai DAC, lalu bagaimana pengaturan akses setelah MAC ditambahkan? Apakah tidak akan bentrok? Jawabannya adalah tidak, karena ada aturan
untuk konflik MAC dan DAC. Aturan yang
dipakai sangat sederhana, yaitu: Jika DAC
tidak mengizinkan aksi, maka MAC tidak
akan diperiksa, tapi jika DAC mengizinkan
aksi, maka MAC akan diperiksa. Jika MAC
mengijinkan aksi, maka aksi dilakukan,
dan jika tidak maka aksi tidak diizinkan.
Ringkasan
Secara sederhana, dalam SELinux user dan
group digantikan oleh sebuah security context, dan bit-bit (read, write, execute, dan
lain-lain) yang tadinya ada untuk mengatur akses file sekarang menjadi access vector yang dituliskan dalam bentuk teks di
file konfigurasi. Tapi tentunya penyederhanaan itu sangat berlebihan, karena tadinya
pembatasan akses di Unix hanya terbatas
untuk file, sedangkan pembatasan SELinux
bisa sampai ke jaringan dan proses.
Pada bagian selanjutnya saya akan
membahas beberapa tools dasar SELinux
serta bagaimana cara mengonfigurasi SELinux.
Yohanes Nugroho [yohanes@gmail.com]
INFOLINUX 06/2006
77