linux: 2008年2月アーカイブ
proftpdのアカウント管理をMySQLでやってみました。
今回、MySQLは5系を使いたかったので、phpと同様、 centosplus リポジトリからインストールしました。
なお、今回インストールする proftpd のパッケージは、SRPMから自分で作成しますので、
あらかじめ rpm-build を導入しておいてください。
■■ rpm-build インストール
[root@hoge ~]# yum install rpm-build
(中略)
Dependencies Resolved
=============================================================================
Package Arch Version Repository Size
=============================================================================
Installing:
rpm-build i386 4.3.3-23_nonptl base 458 k
Transaction Summary
=============================================================================
Install 1 Package(s)
Update 0 Package(s)
Remove 0 Package(s)
Total download size: 458 k
Is this ok [y/N]: y
■■ nullpopopo(管理ユーザ)のrpmビルド環境を作る
rpmのビルドは「必ず」一般ユーザで行います。なので、一般ユーザのホームディレクトリの下に
rpmディレクトリと .rpmmacros ファイルを作成してください。
[root@hoge ~]# su - nullpopopo
[nullpopopo@hoge ~]$ vi .rpmmacros
%_topdir %(echo $HOME)/rpm
%_builddir %{_topdir}/BUILD
%_rpmdir %{_topdir}/RPMS
%_sourcedir %{_topdir}/SOURCES
%_specdir %{_topdir}/SPECS
%_srcrpmdir %{_topdir}/SRPMS
[nullpopopo@hoge ~]$ mkdir -p rpm/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
■■ MySQLサーバのインストール
[root@hoge ~]# yum --enablerepo=centosplus install mysql-server mysql-devel mysqlclient10 mysqlclient10-devel php-mysql
(中略)
Dependencies Resolved
=============================================================================
Package Arch Version Repository Size
=============================================================================
Installing:
mysql-devel i386 5.0.54-1.el4.centos centosplus 2.8 M
mysql-server i386 5.0.54-1.el4.centos centosplus 9.6 M
mysqlclient10 i386 3.23.58-9.2.c4 centosplus 238 k
mysqlclient10-devel i386 3.23.58-9.2.c4 centosplus 48 k
php-mysql i386 5.1.6-3.el4s1.8 centosplus 77 k
Installing for dependencies:
e2fsprogs-devel i386 1.35-12.11.el4_6.1 update 487 k
krb5-devel i386 1.3.4-54 base 824 k
mysql i386 5.0.54-1.el4.centos centosplus 2.8 M
mysql-libs i386 5.0.54-1.el4.centos centosplus 1.8 M
openssl-devel i586 0.9.7a-43.17.el4_6.1 base 1.6 M
perl-Compress-Zlib i386 1.42-1.el4 centosplus 54 k
perl-DBD-MySQL i386 3.0008-1.el4.centos centosplus 145 k
perl-DBI i386 1.54-1.el4s1 centosplus 673 k
perl-HTML-Parser i386 3.35-6 base 82 k
perl-HTML-Tagset noarch 3.03-30 base 12 k
perl-URI noarch 1.30-4 base 79 k
perl-libwww-perl noarch 5.805-1.1.1 centosplus 371 k
php-pdo i386 5.1.6-3.el4s1.8 centosplus 220 k
zlib-devel i386 1.2.1.2-1.2 base 89 k
Updating for dependencies:
perl i386 4:5.8.8-5.el4s1_2 centosplus 11 M
Transaction Summary
=============================================================================
Install 19 Package(s)
Update 1 Package(s)
Remove 0 Package(s)
Total download size: 33 M
Is this ok [y/N]: y
■■ MySQLの起動
■ MySQLの起動
[root@hoge ~]# /etc/init.d/mysqld start
Initializing MySQL database: [ OK ]
Starting MySQL: [ OK ]
■ 自動起動設定
[root@hoge ~]# chkconfig mysqld --list
mysqld 0:off 1:off 2:off 3:off 4:off 5:off 6:off
[root@hoge ~]# chkconfig mysqld on
[root@hoge ~]# chkconfig mysqld --list
mysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off
■■ MySQL Rootパスワードの設定
■ まずはデフォルトのユーザとパスワードを確認する
[nullpopopo@hoge ~]$ mysql -h localhost -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.0.54 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> select user,host,password from mysql.user;
+------+------------------+----------+
| user | host | password |
+------+------------------+----------+
| root | localhost | |
| root | hoge.example.com | |
| root | 127.0.0.1 | |
| | localhost | |
| | hoge.example.com | |
+------+------------------+----------+
5 rows in set (0.00 sec)
■ rootのパスワードを設定する
mysql> set password for root@localhost=password('root_password');
Query OK, 0 rows affected (0.00 sec)
mysql> set password for root@127.0.0.1=password('root_password');
Query OK, 0 rows affected (0.00 sec)
mysql> set password for root@hoge.example.com=password('root_password');
Query OK, 0 rows affected (0.00 sec)
■ パスワードがかかったことを確認する
mysql> select user,host,password from mysql.user;
+------+------------------+------------------+
| user | host | password |
+------+------------------+------------------+
| root | localhost | 3cfeabb26241321d |
| root | hoge.example.com | 3cfeabb26241321d |
| root | 127.0.0.1 | 3cfeabb26241321d |
| | localhost | |
| | hoge.example.com | |
+------+------------------+------------------+
5 rows in set (0.01 sec)
■ 匿名ユーザを削除する
mysql> delete from mysql.user where user='';
Query OK, 2 rows affected (0.00 sec)
mysql> select user,host,password from mysql.user;
+------+------------------+------------------+
| user | host | password |
+------+------------------+------------------+
| root | localhost | 3cfeabb26241321d |
| root | hoge.example.com | 3cfeabb26241321d |
| root | 127.0.0.1 | 3cfeabb26241321d |
+------+------------------+------------------+
3 rows in set (0.00 sec)
mysql> quit
Bye
■ パスワードつきのrootユーザでログインできることを確認する
[nullpopopo@hoge ~]$ mysql -h localhost -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.0.54 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
3 rows in set (0.01 sec)
mysql> quit
Bye
[nullpopopo@hoge ~]$ mysql -h 127.0.0.1 -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.0.54 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
3 rows in set (0.00 sec)
mysql> quit
Bye
[nullpopopo@hoge ~]$ mysql -h hoge.example.com -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.0.54 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
3 rows in set (0.00 sec)
mysql> quit
Bye
■■ MySQL ライブラリの設定
■ 設定ファイルに追記
[root@hoge ~]# cp -p /etc/ld.so.conf /etc/ld.so.conf.orig
[root@hoge ~]# vi /etc/ld.so.conf
ここを
include ld.so.conf.d/*.conf
こうする
include ld.so.conf.d/*.conf
/usr/lib/mysql
■ 設定反映
[root@hoge ~]# ldconfig
■■ ProFTPD インストール
■ ProFTPDのインストールに必要なパッケージをインストールする
[nullpopopo@hoge SRPMS]$ su -
[root@hoge ~]# yum install pam-devel ncurses-devel pkgconfig gcc-c++ openldap-devel libacl-devel postgresql-devel
(中略)
Dependencies Resolved
=============================================================================
Package Arch Version Repository Size
=============================================================================
Installing:
gcc-c++ i386 3.4.6-9 base 2.4 M
libacl-devel i386 2.2.23-5.3.el4 base 78 k
ncurses-devel i386 5.4-15.el4 base 1.4 M
openldap-devel i386 2.2.13-8.el4_6.2 update 1.3 M
pam-devel i386 0.77-66.23 base 85 k
pkgconfig i386 1:0.15.0-3 base 47 k
postgresql-devel i386 7.4.19-1.el4_6.1 update 1.0 M
Installing for dependencies:
cyrus-sasl-devel i386 2.1.19-14 base 1.3 M
libattr-devel i386 2.4.16-3.1.el4 base 28 k
libstdc++-devel i386 3.4.6-9 base 8.6 M
postgresql i386 7.4.19-1.el4_6.1 update 2.0 M
postgresql-libs i386 7.4.19-1.el4_6.1 update 147 k
Transaction Summary
=============================================================================
Install 12 Package(s)
Update 0 Package(s)
Remove 0 Package(s)
Total download size: 18 M
Is this ok [y/N]: y
■ パッケージのダウンロード
[root@hoge ~]# logout
[nullpopopo@hoge ~]$ cd rpm/SRPMS/
[nullpopopo@hoge SRPMS]$ wget http://apt.sw.be/redhat/el4/en/i386/SRPMS.dag/proftpd-1.2.10-10.rf.src.rpm
[nullpopopo@hoge SRPMS]$ rpm -ivh proftpd-1.2.10-10.rf.src.rpm
warning: group dag does not exist - using root
warning: user dag does not exist - using root
は気にしない
[nullpopopo@hoge SRPMS]$ cd ../SPECS/
[nullpopopo@hoge SPECS]$ rpmbuild -ba proftpd.spec --with mysql
[nullpopopo@hoge SPECS]$ rpm -ivh --test ../RPMS/i386/proftpd-1.2.10-10.rf.i386.rpm
[nullpopopo@hoge SPECS]$ su
[root@hoge SPECS]# rpm -ivh ../RPMS/i386/proftpd-1.2.10-10.rf.i386.rpm
Preparing... ########################################### [100%]
1:proftpd ########################################### [100%]
[root@hoge SPECS]# /usr/sbin/proftpd -l
Compiled-in modules:
mod_core.c
mod_xfer.c
mod_auth_unix.c
mod_auth_file.c
mod_auth.c
mod_ls.c
mod_log.c
mod_site.c
mod_readme.c
mod_auth_pam.c
mod_sql.c
mod_sql_mysql.c
mod_tls.c
mod_cap.c
[root@hoge SPECS]# /usr/sbin/proftpd -vv
- ProFTPD Version: 1.2.10 (stable)
- Scoreboard Version: 01040002
- Built: Mon Feb 11 17:33:48 JST 2008
- Module: mod_core.c
- Module: mod_xfer.c
- Module: mod_auth_unix.c
- Module: mod_auth_file.c
- Module: mod_auth.c
- Module: mod_ls.c
- Module: mod_log.c
- Module: mod_site.c
- Module: mod_readme.c
- Module: mod_auth_pam.c
- Module: mod_sql.c
- Module: mod_sql_mysql.c
- Module: mod_tls.c
- Module: mod_cap/1.0
[root@hoge SPECS]# ldd /usr/sbin/proftpd
libcrypt.so.1 => /lib/libcrypt.so.1 (0x0084d000)
libssl.so.4 => /lib/libssl.so.4 (0x00a5d000)
libcrypto.so.4 => /lib/libcrypto.so.4 (0x008f4000)
libm.so.6 => /lib/tls/libm.so.6 (0x00806000)
libz.so.1 => /usr/lib/libz.so.1 (0x0083b000)
libmysqlclient.so.15 => /usr/lib/mysql/libmysqlclient.so.15 (0x00111000)
libpam.so.0 => /lib/libpam.so.0 (0x00a93000)
libc.so.6 => /lib/tls/libc.so.6 (0x006d2000)
libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0x009e0000)
libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0x009f6000)
libcom_err.so.2 => /lib/libcom_err.so.2 (0x0082b000)
libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0x008d1000)
libresolv.so.2 => /lib/libresolv.so.2 (0x0087d000)
libdl.so.2 => /lib/libdl.so.2 (0x00800000)
/lib/ld-linux.so.2 (0x006b8000)
libnsl.so.1 => /lib/libnsl.so.1 (0x00892000)
libaudit.so.0 => /lib/libaudit.so.0 (0x008ab000)
mod_sql.c と mod_sql_mysql.c がモジュールに組み込まれ、 libmysqlclient.so.15 がリンクされてるのでOK。
[root@hoge SPECS]# exit
[nullpopopo@hoge SPECS]$ su -
Password:
[root@hoge ~]#
■ ProFTPD 1.2.10 自動起動設定
[root@hoge ~]# chkconfig proftpd on
[root@hoge ~]# chkconfig proftpd --list
proftpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
■ MySQL ProFTPD用データベースの作成
[root@hoge ~]# mkdir /etc/proftpd
[root@hoge ~]# cd /etc/proftpd
[root@hoge proftpd]# vi proftpd.schema
CREATE TABLE groups (
groupname VARCHAR(30) NOT NULL ,
gid SMALLINT(5) UNSIGNED NOT NULL DEFAULT 1000,
members varchar(255) default NULL,
PRIMARY KEY ( groupname ),
UNIQUE KEY gid (gid)
);
CREATE TABLE users (
userid varchar(30) NOT NULL,
password varchar(30) NOT NULL,
uid SMALLINT(5) UNSIGNED NOT NULL DEFAULT 1000,
gid SMALLINT(5) UNSIGNED NOT NULL DEFAULT 1000,
homedir varchar(255) default NULL,
shell varchar(255) default '/bin/true',
PRIMARY KEY (userid),
UNIQUE KEY uid (uid)
);
■ データベース「proftpd」を作成する。
[root@hoge proftpd]# mysqladmin -u root -p create proftpd
Enter password:
[root@hoge proftpd]# mysql -u root -p < proftpd.schema proftpd
Enter password:
[root@hoge proftpd]# mysql -u root -p proftpd
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.0.54 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
■ proftpd データベースのユーザ proftpd を作成する
mysql> GRANT SELECT,UPDATE,INSERT ON proftpd.* TO proftpd@localhost IDENTIFIED BY 'proftpd_password';
Query OK, 0 rows affected (0.02 sec)
mysql> exit
Bye
■ DBをreloadする
[root@hoge proftpd]# mysqladmin -u root -p reload
Enter password:
■ ProFTPD設定
[root@hoge proftpd]# cd /etc/
[root@hoge etc]# cp -p proftpd.conf proftpd.conf.orig
[root@hoge etc]# vi proftpd.conf
# This is a basic ProFTPD configuration file (rename it to
# 'proftpd.conf' for actual use. It establishes a single server
# and a single anonymous login. It assumes that you have a user/group
# "nobody" and "ftp" for normal operation and anon.
ServerIdent on ""
ServerName "hoge.example.com"
ServerType standalone
DefaultServer on
# Port 21 is the standard FTP port.
Port 21
# Umask 022 is a good standard umask to prevent new dirs and files
# from being group and world writable.
Umask 022
RootLogin off
#ListOptions "-la"
ListOptions "-a"
# To prevent DoS attacks, set the maximum number of child processes
# to 30. If you need to allow more than 30 concurrent connections
# at once, simply increase this value. Note that this ONLY works
# in standalone mode, in inetd mode you should use an inetd server
# that allows you to limit maximum number of processes per service
# (such as xinetd).
MaxInstances 30
# Set the user and group under which the server will run.
#User nobody
#Group nogroup
User webmaster
Group webmaster
# To cause every FTP user to be "jailed" (chrooted) into their home
# directory, uncomment this line.
#DefaultRoot ~
DefaultRoot ~ !wheel
RequireValidShell off
UseReverseDNS off
IdentLookups off
TimesGMT off
#TimesGMT on
TimeoutIdle 600
TimeoutLogin 300
TimeoutNoTransfer 600
TimeoutStalled 600
ShowSymlinks on
MaxClientsPerHost 3
MaxHostsPerUser 10
#AllowStoreRestart on
#AllowRetrieveRestart on
#MaxStoreFileSize 100Mb
LogFormat allinfo "%t : %u (%a [%h]) : [%s], %T, %m (%f)"
LogFormat write "%t : %u : %F (%a)"
LogFormat read "%t : %u : %F (%a)"
LogFormat auth "%t : %u (%a [%h])"
ExtendedLog /var/log/proftpd/all.log ALL allinfo
ExtendedLog /var/log/proftpd/write.log WRITE write
ExtendedLog /var/log/proftpd/read.log READ read
ExtendedLog /var/log/proftpd/auth.log AUTH auth
<Directory /*>
AllowOverwrite on
AllowStoreRestart on
AllowRetrieveRestart on
</Directory>
<IfModule mod_sql_mysql.c>
SQLAuthenticate users
SQLConnectInfo proftpd@localhost:3306 proftpd proftpd_password
SQLAuthTypes Plaintext
SQLUserInfo users userid password uid gid homedir shell
SQLGroupInfo groups groupname gid members
AuthOrder mod_sql.c
</IfModule>
# Normally, we want files to be overwriteable.
AllowOverwrite on
# Bar use of SITE CHMOD by default
#<Limit SITE_CHMOD>
# DenyAll
#</Limit>
# chmodコマンドが叩けないので、叩けるようにした
# by nullpopopo 2008/02/11
<Limit SITE_CHMOD>
AllowAll
</Limit>
<Directory /var/ftp>
<Limit ALL>
DenyAll
</Limit>
</Directory>
# A basic anonymous configuration, no upload directories. If you do not
# want anonymous users, simply delete this entire <Anonymous> section.
#<Anonymous ~ftp>
# User ftp
# Group ftp
#
# # We want clients to be able to login with "anonymous" as well as "ftp"
# UserAlias anonymous ftp
#
# # Limit the maximum number of anonymous logins
# MaxClients 10
#
# # We want 'welcome.msg' displayed at login, and '.message' displayed
# # in each newly chdired directory.
# DisplayLogin welcome.msg
# DisplayFirstChdir .message
#
# # Limit WRITE everywhere in the anonymous chroot
# <Limit WRITE>
# DenyAll
# </Limit>
#</Anonymous>
■ ProFTPD 1.2.10 グループ・ユーザをDBに追加
[root@hoge etc]# mysql -u root -p proftpd
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 5.0.54 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
mysql> show tables;
+-------------------+
| Tables_in_proftpd |
+-------------------+
| groups |
| users |
+-------------------+
2 rows in set (0.00 sec)
グループを追加する。
mysql> INSERT INTO groups VALUES ('vhost',1000,'');
Query OK, 1 row affected (0.02 sec)
ユーザを追加する。
テーブル「users」へ追加するデータは
「ユーザ名」「パスワード」「UID」「GID」「ホームディレクトリ」「シェル」の順番である。
mysql> INSERT INTO users VALUES ('www_example_com','www_example_com',1000,1000,'/home/vhost/www.example.com','/bin/true');
Query OK, 1 row affected (0.00 sec)
グループの確認
mysql> select * from groups;
+-----------+------+---------+
| groupname | gid | members |
+-----------+------+---------+
| vhost | 1000 | |
+-----------+------+---------+
1 row in set (0.00 sec)
ユーザの確認
mysql> select * from users;
+-----------------+-----------------+------+------+-----------------------------+-----------+
| userid | password | uid | gid | homedir | shell |
+-----------------+-----------------+------+------+-----------------------------+-----------+
| www_example_com | www_example_com | 1000 | 1000 | /home/vhost/www.example.com | /bin/true |
+-----------------+-----------------+------+------+-----------------------------+-----------+
1 row in set (0.00 sec)
mysql> exit
Bye
■■ proftpd 起動スクリプト修正
TimesGMT の'(on|off|FALSE)'にもかかわらず、FTPクライアントに表示されたりxferlogに書き込まれたりする
時刻が9時間遅い問題があるので、起動スクリプトを修正することで解決する。
[root@hoge etc]# vi /etc/init.d/proftpd
ここを
start() {
echo -n $"Starting $prog: "
daemon proftpd
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/proftpd
}
こうする
start() {
echo -n $"Starting $prog: "
export TZ=JST-9
daemon proftpd
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/proftpd
}
■■ proftpd 起動
[root@hoge etc]# /etc/init.d/proftpd start
Starting proftpd: [ OK ]
あとは、FTPユーザ www_example_com でログインし、ファイルのDOWN/UPを試してください。
ファイルやディレクトリのタイムスタンプが9時間ズレていなければOKです。
今回、MySQLは5系を使いたかったので、phpと同様、 centosplus リポジトリからインストールしました。
なお、今回インストールする proftpd のパッケージは、SRPMから自分で作成しますので、
あらかじめ rpm-build を導入しておいてください。
■■ rpm-build インストール
[root@hoge ~]# yum install rpm-build
(中略)
Dependencies Resolved
=============================================================================
Package Arch Version Repository Size
=============================================================================
Installing:
rpm-build i386 4.3.3-23_nonptl base 458 k
Transaction Summary
=============================================================================
Install 1 Package(s)
Update 0 Package(s)
Remove 0 Package(s)
Total download size: 458 k
Is this ok [y/N]: y
■■ nullpopopo(管理ユーザ)のrpmビルド環境を作る
rpmのビルドは「必ず」一般ユーザで行います。なので、一般ユーザのホームディレクトリの下に
rpmディレクトリと .rpmmacros ファイルを作成してください。
[root@hoge ~]# su - nullpopopo
[nullpopopo@hoge ~]$ vi .rpmmacros
%_topdir %(echo $HOME)/rpm
%_builddir %{_topdir}/BUILD
%_rpmdir %{_topdir}/RPMS
%_sourcedir %{_topdir}/SOURCES
%_specdir %{_topdir}/SPECS
%_srcrpmdir %{_topdir}/SRPMS
[nullpopopo@hoge ~]$ mkdir -p rpm/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
■■ MySQLサーバのインストール
[root@hoge ~]# yum --enablerepo=centosplus install mysql-server mysql-devel mysqlclient10 mysqlclient10-devel php-mysql
(中略)
Dependencies Resolved
=============================================================================
Package Arch Version Repository Size
=============================================================================
Installing:
mysql-devel i386 5.0.54-1.el4.centos centosplus 2.8 M
mysql-server i386 5.0.54-1.el4.centos centosplus 9.6 M
mysqlclient10 i386 3.23.58-9.2.c4 centosplus 238 k
mysqlclient10-devel i386 3.23.58-9.2.c4 centosplus 48 k
php-mysql i386 5.1.6-3.el4s1.8 centosplus 77 k
Installing for dependencies:
e2fsprogs-devel i386 1.35-12.11.el4_6.1 update 487 k
krb5-devel i386 1.3.4-54 base 824 k
mysql i386 5.0.54-1.el4.centos centosplus 2.8 M
mysql-libs i386 5.0.54-1.el4.centos centosplus 1.8 M
openssl-devel i586 0.9.7a-43.17.el4_6.1 base 1.6 M
perl-Compress-Zlib i386 1.42-1.el4 centosplus 54 k
perl-DBD-MySQL i386 3.0008-1.el4.centos centosplus 145 k
perl-DBI i386 1.54-1.el4s1 centosplus 673 k
perl-HTML-Parser i386 3.35-6 base 82 k
perl-HTML-Tagset noarch 3.03-30 base 12 k
perl-URI noarch 1.30-4 base 79 k
perl-libwww-perl noarch 5.805-1.1.1 centosplus 371 k
php-pdo i386 5.1.6-3.el4s1.8 centosplus 220 k
zlib-devel i386 1.2.1.2-1.2 base 89 k
Updating for dependencies:
perl i386 4:5.8.8-5.el4s1_2 centosplus 11 M
Transaction Summary
=============================================================================
Install 19 Package(s)
Update 1 Package(s)
Remove 0 Package(s)
Total download size: 33 M
Is this ok [y/N]: y
■■ MySQLの起動
■ MySQLの起動
[root@hoge ~]# /etc/init.d/mysqld start
Initializing MySQL database: [ OK ]
Starting MySQL: [ OK ]
■ 自動起動設定
[root@hoge ~]# chkconfig mysqld --list
mysqld 0:off 1:off 2:off 3:off 4:off 5:off 6:off
[root@hoge ~]# chkconfig mysqld on
[root@hoge ~]# chkconfig mysqld --list
mysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off
■■ MySQL Rootパスワードの設定
■ まずはデフォルトのユーザとパスワードを確認する
[nullpopopo@hoge ~]$ mysql -h localhost -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.0.54 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> select user,host,password from mysql.user;
+------+------------------+----------+
| user | host | password |
+------+------------------+----------+
| root | localhost | |
| root | hoge.example.com | |
| root | 127.0.0.1 | |
| | localhost | |
| | hoge.example.com | |
+------+------------------+----------+
5 rows in set (0.00 sec)
■ rootのパスワードを設定する
mysql> set password for root@localhost=password('root_password');
Query OK, 0 rows affected (0.00 sec)
mysql> set password for root@127.0.0.1=password('root_password');
Query OK, 0 rows affected (0.00 sec)
mysql> set password for root@hoge.example.com=password('root_password');
Query OK, 0 rows affected (0.00 sec)
■ パスワードがかかったことを確認する
mysql> select user,host,password from mysql.user;
+------+------------------+------------------+
| user | host | password |
+------+------------------+------------------+
| root | localhost | 3cfeabb26241321d |
| root | hoge.example.com | 3cfeabb26241321d |
| root | 127.0.0.1 | 3cfeabb26241321d |
| | localhost | |
| | hoge.example.com | |
+------+------------------+------------------+
5 rows in set (0.01 sec)
■ 匿名ユーザを削除する
mysql> delete from mysql.user where user='';
Query OK, 2 rows affected (0.00 sec)
mysql> select user,host,password from mysql.user;
+------+------------------+------------------+
| user | host | password |
+------+------------------+------------------+
| root | localhost | 3cfeabb26241321d |
| root | hoge.example.com | 3cfeabb26241321d |
| root | 127.0.0.1 | 3cfeabb26241321d |
+------+------------------+------------------+
3 rows in set (0.00 sec)
mysql> quit
Bye
■ パスワードつきのrootユーザでログインできることを確認する
[nullpopopo@hoge ~]$ mysql -h localhost -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.0.54 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
3 rows in set (0.01 sec)
mysql> quit
Bye
[nullpopopo@hoge ~]$ mysql -h 127.0.0.1 -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.0.54 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
3 rows in set (0.00 sec)
mysql> quit
Bye
[nullpopopo@hoge ~]$ mysql -h hoge.example.com -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.0.54 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
+--------------------+
3 rows in set (0.00 sec)
mysql> quit
Bye
■■ MySQL ライブラリの設定
■ 設定ファイルに追記
[root@hoge ~]# cp -p /etc/ld.so.conf /etc/ld.so.conf.orig
[root@hoge ~]# vi /etc/ld.so.conf
ここを
include ld.so.conf.d/*.conf
こうする
include ld.so.conf.d/*.conf
/usr/lib/mysql
■ 設定反映
[root@hoge ~]# ldconfig
■■ ProFTPD インストール
■ ProFTPDのインストールに必要なパッケージをインストールする
[nullpopopo@hoge SRPMS]$ su -
[root@hoge ~]# yum install pam-devel ncurses-devel pkgconfig gcc-c++ openldap-devel libacl-devel postgresql-devel
(中略)
Dependencies Resolved
=============================================================================
Package Arch Version Repository Size
=============================================================================
Installing:
gcc-c++ i386 3.4.6-9 base 2.4 M
libacl-devel i386 2.2.23-5.3.el4 base 78 k
ncurses-devel i386 5.4-15.el4 base 1.4 M
openldap-devel i386 2.2.13-8.el4_6.2 update 1.3 M
pam-devel i386 0.77-66.23 base 85 k
pkgconfig i386 1:0.15.0-3 base 47 k
postgresql-devel i386 7.4.19-1.el4_6.1 update 1.0 M
Installing for dependencies:
cyrus-sasl-devel i386 2.1.19-14 base 1.3 M
libattr-devel i386 2.4.16-3.1.el4 base 28 k
libstdc++-devel i386 3.4.6-9 base 8.6 M
postgresql i386 7.4.19-1.el4_6.1 update 2.0 M
postgresql-libs i386 7.4.19-1.el4_6.1 update 147 k
Transaction Summary
=============================================================================
Install 12 Package(s)
Update 0 Package(s)
Remove 0 Package(s)
Total download size: 18 M
Is this ok [y/N]: y
■ パッケージのダウンロード
[root@hoge ~]# logout
[nullpopopo@hoge ~]$ cd rpm/SRPMS/
[nullpopopo@hoge SRPMS]$ wget http://apt.sw.be/redhat/el4/en/i386/SRPMS.dag/proftpd-1.2.10-10.rf.src.rpm
[nullpopopo@hoge SRPMS]$ rpm -ivh proftpd-1.2.10-10.rf.src.rpm
warning: group dag does not exist - using root
warning: user dag does not exist - using root
は気にしない
[nullpopopo@hoge SRPMS]$ cd ../SPECS/
[nullpopopo@hoge SPECS]$ rpmbuild -ba proftpd.spec --with mysql
[nullpopopo@hoge SPECS]$ rpm -ivh --test ../RPMS/i386/proftpd-1.2.10-10.rf.i386.rpm
[nullpopopo@hoge SPECS]$ su
[root@hoge SPECS]# rpm -ivh ../RPMS/i386/proftpd-1.2.10-10.rf.i386.rpm
Preparing... ########################################### [100%]
1:proftpd ########################################### [100%]
[root@hoge SPECS]# /usr/sbin/proftpd -l
Compiled-in modules:
mod_core.c
mod_xfer.c
mod_auth_unix.c
mod_auth_file.c
mod_auth.c
mod_ls.c
mod_log.c
mod_site.c
mod_readme.c
mod_auth_pam.c
mod_sql.c
mod_sql_mysql.c
mod_tls.c
mod_cap.c
[root@hoge SPECS]# /usr/sbin/proftpd -vv
- ProFTPD Version: 1.2.10 (stable)
- Scoreboard Version: 01040002
- Built: Mon Feb 11 17:33:48 JST 2008
- Module: mod_core.c
- Module: mod_xfer.c
- Module: mod_auth_unix.c
- Module: mod_auth_file.c
- Module: mod_auth.c
- Module: mod_ls.c
- Module: mod_log.c
- Module: mod_site.c
- Module: mod_readme.c
- Module: mod_auth_pam.c
- Module: mod_sql.c
- Module: mod_sql_mysql.c
- Module: mod_tls.c
- Module: mod_cap/1.0
[root@hoge SPECS]# ldd /usr/sbin/proftpd
libcrypt.so.1 => /lib/libcrypt.so.1 (0x0084d000)
libssl.so.4 => /lib/libssl.so.4 (0x00a5d000)
libcrypto.so.4 => /lib/libcrypto.so.4 (0x008f4000)
libm.so.6 => /lib/tls/libm.so.6 (0x00806000)
libz.so.1 => /usr/lib/libz.so.1 (0x0083b000)
libmysqlclient.so.15 => /usr/lib/mysql/libmysqlclient.so.15 (0x00111000)
libpam.so.0 => /lib/libpam.so.0 (0x00a93000)
libc.so.6 => /lib/tls/libc.so.6 (0x006d2000)
libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2 (0x009e0000)
libkrb5.so.3 => /usr/lib/libkrb5.so.3 (0x009f6000)
libcom_err.so.2 => /lib/libcom_err.so.2 (0x0082b000)
libk5crypto.so.3 => /usr/lib/libk5crypto.so.3 (0x008d1000)
libresolv.so.2 => /lib/libresolv.so.2 (0x0087d000)
libdl.so.2 => /lib/libdl.so.2 (0x00800000)
/lib/ld-linux.so.2 (0x006b8000)
libnsl.so.1 => /lib/libnsl.so.1 (0x00892000)
libaudit.so.0 => /lib/libaudit.so.0 (0x008ab000)
mod_sql.c と mod_sql_mysql.c がモジュールに組み込まれ、 libmysqlclient.so.15 がリンクされてるのでOK。
[root@hoge SPECS]# exit
[nullpopopo@hoge SPECS]$ su -
Password:
[root@hoge ~]#
■ ProFTPD 1.2.10 自動起動設定
[root@hoge ~]# chkconfig proftpd on
[root@hoge ~]# chkconfig proftpd --list
proftpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
■ MySQL ProFTPD用データベースの作成
[root@hoge ~]# mkdir /etc/proftpd
[root@hoge ~]# cd /etc/proftpd
[root@hoge proftpd]# vi proftpd.schema
CREATE TABLE groups (
groupname VARCHAR(30) NOT NULL ,
gid SMALLINT(5) UNSIGNED NOT NULL DEFAULT 1000,
members varchar(255) default NULL,
PRIMARY KEY ( groupname ),
UNIQUE KEY gid (gid)
);
CREATE TABLE users (
userid varchar(30) NOT NULL,
password varchar(30) NOT NULL,
uid SMALLINT(5) UNSIGNED NOT NULL DEFAULT 1000,
gid SMALLINT(5) UNSIGNED NOT NULL DEFAULT 1000,
homedir varchar(255) default NULL,
shell varchar(255) default '/bin/true',
PRIMARY KEY (userid),
UNIQUE KEY uid (uid)
);
■ データベース「proftpd」を作成する。
[root@hoge proftpd]# mysqladmin -u root -p create proftpd
Enter password:
[root@hoge proftpd]# mysql -u root -p < proftpd.schema proftpd
Enter password:
[root@hoge proftpd]# mysql -u root -p proftpd
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.0.54 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
■ proftpd データベースのユーザ proftpd を作成する
mysql> GRANT SELECT,UPDATE,INSERT ON proftpd.* TO proftpd@localhost IDENTIFIED BY 'proftpd_password';
Query OK, 0 rows affected (0.02 sec)
mysql> exit
Bye
■ DBをreloadする
[root@hoge proftpd]# mysqladmin -u root -p reload
Enter password:
■ ProFTPD設定
[root@hoge proftpd]# cd /etc/
[root@hoge etc]# cp -p proftpd.conf proftpd.conf.orig
[root@hoge etc]# vi proftpd.conf
# This is a basic ProFTPD configuration file (rename it to
# 'proftpd.conf' for actual use. It establishes a single server
# and a single anonymous login. It assumes that you have a user/group
# "nobody" and "ftp" for normal operation and anon.
ServerIdent on ""
ServerName "hoge.example.com"
ServerType standalone
DefaultServer on
# Port 21 is the standard FTP port.
Port 21
# Umask 022 is a good standard umask to prevent new dirs and files
# from being group and world writable.
Umask 022
RootLogin off
#ListOptions "-la"
ListOptions "-a"
# To prevent DoS attacks, set the maximum number of child processes
# to 30. If you need to allow more than 30 concurrent connections
# at once, simply increase this value. Note that this ONLY works
# in standalone mode, in inetd mode you should use an inetd server
# that allows you to limit maximum number of processes per service
# (such as xinetd).
MaxInstances 30
# Set the user and group under which the server will run.
#User nobody
#Group nogroup
User webmaster
Group webmaster
# To cause every FTP user to be "jailed" (chrooted) into their home
# directory, uncomment this line.
#DefaultRoot ~
DefaultRoot ~ !wheel
RequireValidShell off
UseReverseDNS off
IdentLookups off
TimesGMT off
#TimesGMT on
TimeoutIdle 600
TimeoutLogin 300
TimeoutNoTransfer 600
TimeoutStalled 600
ShowSymlinks on
MaxClientsPerHost 3
MaxHostsPerUser 10
#AllowStoreRestart on
#AllowRetrieveRestart on
#MaxStoreFileSize 100Mb
LogFormat allinfo "%t : %u (%a [%h]) : [%s], %T, %m (%f)"
LogFormat write "%t : %u : %F (%a)"
LogFormat read "%t : %u : %F (%a)"
LogFormat auth "%t : %u (%a [%h])"
ExtendedLog /var/log/proftpd/all.log ALL allinfo
ExtendedLog /var/log/proftpd/write.log WRITE write
ExtendedLog /var/log/proftpd/read.log READ read
ExtendedLog /var/log/proftpd/auth.log AUTH auth
<Directory /*>
AllowOverwrite on
AllowStoreRestart on
AllowRetrieveRestart on
</Directory>
<IfModule mod_sql_mysql.c>
SQLAuthenticate users
SQLConnectInfo proftpd@localhost:3306 proftpd proftpd_password
SQLAuthTypes Plaintext
SQLUserInfo users userid password uid gid homedir shell
SQLGroupInfo groups groupname gid members
AuthOrder mod_sql.c
</IfModule>
# Normally, we want files to be overwriteable.
AllowOverwrite on
# Bar use of SITE CHMOD by default
#<Limit SITE_CHMOD>
# DenyAll
#</Limit>
# chmodコマンドが叩けないので、叩けるようにした
# by nullpopopo 2008/02/11
<Limit SITE_CHMOD>
AllowAll
</Limit>
<Directory /var/ftp>
<Limit ALL>
DenyAll
</Limit>
</Directory>
# A basic anonymous configuration, no upload directories. If you do not
# want anonymous users, simply delete this entire <Anonymous> section.
#<Anonymous ~ftp>
# User ftp
# Group ftp
#
# # We want clients to be able to login with "anonymous" as well as "ftp"
# UserAlias anonymous ftp
#
# # Limit the maximum number of anonymous logins
# MaxClients 10
#
# # We want 'welcome.msg' displayed at login, and '.message' displayed
# # in each newly chdired directory.
# DisplayLogin welcome.msg
# DisplayFirstChdir .message
#
# # Limit WRITE everywhere in the anonymous chroot
# <Limit WRITE>
# DenyAll
# </Limit>
#</Anonymous>
■ ProFTPD 1.2.10 グループ・ユーザをDBに追加
[root@hoge etc]# mysql -u root -p proftpd
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 5.0.54 Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
mysql> show tables;
+-------------------+
| Tables_in_proftpd |
+-------------------+
| groups |
| users |
+-------------------+
2 rows in set (0.00 sec)
グループを追加する。
mysql> INSERT INTO groups VALUES ('vhost',1000,'');
Query OK, 1 row affected (0.02 sec)
ユーザを追加する。
テーブル「users」へ追加するデータは
「ユーザ名」「パスワード」「UID」「GID」「ホームディレクトリ」「シェル」の順番である。
mysql> INSERT INTO users VALUES ('www_example_com','www_example_com',1000,1000,'/home/vhost/www.example.com','/bin/true');
Query OK, 1 row affected (0.00 sec)
グループの確認
mysql> select * from groups;
+-----------+------+---------+
| groupname | gid | members |
+-----------+------+---------+
| vhost | 1000 | |
+-----------+------+---------+
1 row in set (0.00 sec)
ユーザの確認
mysql> select * from users;
+-----------------+-----------------+------+------+-----------------------------+-----------+
| userid | password | uid | gid | homedir | shell |
+-----------------+-----------------+------+------+-----------------------------+-----------+
| www_example_com | www_example_com | 1000 | 1000 | /home/vhost/www.example.com | /bin/true |
+-----------------+-----------------+------+------+-----------------------------+-----------+
1 row in set (0.00 sec)
mysql> exit
Bye
■■ proftpd 起動スクリプト修正
TimesGMT の'(on|off|FALSE)'にもかかわらず、FTPクライアントに表示されたりxferlogに書き込まれたりする
時刻が9時間遅い問題があるので、起動スクリプトを修正することで解決する。
[root@hoge etc]# vi /etc/init.d/proftpd
ここを
start() {
echo -n $"Starting $prog: "
daemon proftpd
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/proftpd
}
こうする
start() {
echo -n $"Starting $prog: "
export TZ=JST-9
daemon proftpd
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/proftpd
}
■■ proftpd 起動
[root@hoge etc]# /etc/init.d/proftpd start
Starting proftpd: [ OK ]
あとは、FTPユーザ www_example_com でログインし、ファイルのDOWN/UPを試してください。
ファイルやディレクトリのタイムスタンプが9時間ズレていなければOKです。
久々のサーバ構築案件なので、忘れんようにメモ。
今回作成するホスト www.example.com はバーチャルホストとして作ります。
そして、 www.example.com のFTPアカウントはMySQLで管理します。
今後、FTPアカウントの管理やバーチャルホストのconfigはプログラムにやらせたいなー。
■■ webスペースの領域作成
FTPアカウントは今後MySQLに管理させます。ここのUID/GIDは、UNIXアカウントとは別物です。
FTPアカウントをMySQLに管理させる方法は次のエントリに書きます。乞うご期待!
[root@hoge ~]# mkdir /home/vhost
[root@hoge ~]# mkdir -p /home/vhost/www.example.com/{html,cgi-bin,logs,auth}
[root@hoge ~]# chown -R 1000:1000 /home/vhost/
■■ apache インストール
[root@hoge ~]# yum install httpd mod_ssl
(中略)
Dependencies Resolved
=============================================================================
Package Arch Version Repository Size
=============================================================================
Installing:
httpd i386 2.0.52-38.ent.centos4.2 update 891 k
mod_ssl i386 1:2.0.52-38.ent.centos4.2 update 100 k
Installing for dependencies:
apr i386 0.9.4-24.9 base 93 k
apr-util i386 0.9.4-21 base 51 k
distcache i386 1.4.5-6 base 111 k
httpd-suexec i386 2.0.52-38.ent.centos4.2 update 30 k
Transaction Summary
=============================================================================
Install 6 Package(s)
Update 0 Package(s)
Remove 0 Package(s)
Total download size: 1.2 M
Is this ok [y/N]: y
■■ php5のインストール
通常、CentOS4.x系では、yumコマンドでphpをインストールしようとすると、
PHP4系がインストールされます。しかし、もうサポート終わってるので
(セキュリティサポートは2008年8月まで)
centosplusリポジトリを一時的に有効にしてやってPHP5をインストールしてやります。
[root@hoge ~]# yum --enablerepo=centosplus install php
(中略)
Dependencies Resolved
=============================================================================
Package Arch Version Repository Size
=============================================================================
Installing:
php i386 5.1.6-3.el4s1.8 centosplus 1.1 M
Installing for dependencies:
curl i386 7.12.1-11.el4 base 230 k
libidn i386 0.5.6-1 base 169 k
php-cli i386 5.1.6-3.el4s1.8 centosplus 2.0 M
php-common i386 5.1.6-3.el4s1.8 centosplus 136 k
Transaction Summary
=============================================================================
Install 5 Package(s)
Update 0 Package(s)
Remove 0 Package(s)
Total download size: 3.7 M
Is this ok [y/N]: y
■ さらに、pearもcentosplus経由でインストールする
[root@hoge ~]# yum --enablerepo=centosplus install php-pear
(中略)
Dependencies Resolved
=============================================================================
Package Arch Version Repository Size
=============================================================================
Installing:
php-pear noarch 1:1.4.11-1.el4s1.1 centosplus 345 k
Transaction Summary
=============================================================================
Install 1 Package(s)
Update 0 Package(s)
Remove 0 Package(s)
Total download size: 345 k
Is this ok [y/N]: y
■ pearが有効になっているか確認する
[root@hoge ~]# pear list
Installed packages, channel pear.php.net:
=========================================
Package Version State
Archive_Tar 1.3.1 stable
Console_Getopt 1.2 stable
PEAR 1.4.11 stable
XML_RPC 1.5.1 stable
■■ apacheの設定を修正する
■ httpd.confを修正する
[root@hoge ~]# cd /etc/httpd/conf
[root@hoge conf]# cp -p httpd.conf httpd.conf.orig
[root@hoge conf]# vi httpd.conf
#---- ServerTokensディレクティブでの表示を最小限にするため
#---- ここを
#---- ServerTokens OS
#----
#---- こうする
#---- #ServerTokens OS
#---- ServerTokens Prod
#---- サーバ管理者のメールアドレスを変更するため
#---- ここを
#---- ServerAdmin root@localhost
#----
#---- こうする
#---- #ServerAdmin root@localhost
#---- ServerAdmin webmaster@hoge.example.com
#---- すべてvirtualhostで管理するので、以下をコメントアウトする
#----
#---- ここを
#---- DocumentRoot "/var/www/html"
#---- こうする
#---- #DocumentRoot "/var/www/html"
#----
#---- ここを
#---- <Directory />
#---- Options FollowSymLinks
#---- AllowOverride None
#---- </Directory>
#----
#---- こうする
#---- #<Directory />
#---- # Options FollowSymLinks
#---- # AllowOverride None
#---- #</Directory>
#----
#---- ここを
#---- <Directory "/var/www/html">
#----
#---- #
#---- # Possible values for the Options directive are "None", "All",
#---- # or any combination of:
#---- # Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#---- #
#---- # Note that "MultiViews" must be named *explicitly* --- "Options All"
#---- # doesn't give it to you.
#---- #
#---- # The Options directive is both complicated and important. Please see
#---- # http://httpd.apache.org/docs-2.0/mod/core.html#options
#---- # for more information.
#---- #
#---- Options Indexes FollowSymLinks
#----
#---- #
#---- # AllowOverride controls what directives may be placed in .htaccess files.
#---- # It can be "All", "None", or any combination of the keywords:
#---- # Options FileInfo AuthConfig Limit
#---- #
#---- AllowOverride None
#----
#---- #
#---- # Controls who can get stuff from this server.
#---- #
#---- Order allow,deny
#---- Allow from all
#----
#---- </Directory>
#----
#---- こうする
#---- ##### comented by nullpopopo 2008/02/10
#---- #<Directory "/var/www/html">
#---- #
#---- ##
#---- ## Possible values for the Options directive are "None", "All",
#---- ## or any combination of:
#---- ## Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#---- ##
#---- ## Note that "MultiViews" must be named *explicitly* --- "Options All"
#---- ## doesn't give it to you.
#---- ##
#---- ## The Options directive is both complicated and important. Please see
#---- ## http://httpd.apache.org/docs-2.0/mod/core.html#options
#---- ## for more information.
#---- ##
#---- # Options Indexes FollowSymLinks
#---- #
#---- ##
#---- ## AllowOverride controls what directives may be placed in .htaccess files.
#---- ## It can be "All", "None", or any combination of the keywords:
#---- ## Options FileInfo AuthConfig Limit
#---- ##
#---- # AllowOverride None
#---- #
#---- ##
#---- ## Controls who can get stuff from this server.
#---- ##
#---- # Order allow,deny
#---- # Allow from all
#---- #
#---- #</Directory>
#---- userdirを使わないので無効にする
#----
#---- ここを
#---- <IfModule mod_userdir.c>
#---- #
#---- # UserDir is disabled by default since it can confirm the presence
#---- # of a username on the system (depending on home directory
#---- # permissions).
#---- #
#---- UserDir disable
#----
#---- #
#---- # To enable requests to /~user/ to serve the user's public_html
#---- # directory, remove the "UserDir disable" line above, and uncomment
#---- # the following line instead:
#---- #
#---- #UserDir public_html
#----
#---- </IfModule>
#----
#---- こうする
#---- ##### comented by nullpopopo 2008/02/10
#---- #<IfModule mod_userdir.c>
#---- # #
#---- # # UserDir is disabled by default since it can confirm the presence
#---- # # of a username on the system (depending on home directory
#---- # # permissions).
#---- # #
#---- # UserDir disable
#---- #
#---- # #
#---- # # To enable requests to /~user/ to serve the user's public_html
#---- # # directory, remove the "UserDir disable" line above, and uncomment
#---- # # the following line instead:
#---- # #
#---- # #UserDir public_html
#---- #
#---- #</IfModule>
#----
#---- ServerSignatureをOffにしてApache が生成したドキュメント中の情報を抑制する
#----
#---- ここを
#---- ServerSignature On
#----
#---- こうする
#---- #ServerSignature On
#---- ServerSignature Off
#---- WebDAVを使わないので無効にする
#----
#---- ここを
#---- #
#---- # WebDAV module configuration section.
#---- #
#---- <IfModule mod_dav_fs.c>
#---- # Location of the WebDAV lock database.
#---- DAVLockDB /var/lib/dav/lockdb
#---- </IfModule>
#----
#---- こうする
#---- ##
#---- ## WebDAV module configuration section.
#---- ##
#---- #<IfModule mod_dav_fs.c>
#---- # # Location of the WebDAV lock database.
#---- # DAVLockDB /var/lib/dav/lockdb
#---- #</IfModule>
#---- /var/www/cgi-bin/ を使わないので無効にする
#----
#---- ここを
#---- #
#---- # ScriptAlias: This controls which directories contain server scripts.
#---- # ScriptAliases are essentially the same as Aliases, except that
#---- # documents in the realname directory are treated as applications and
#---- # run by the server when requested rather than as documents sent to the client.
#---- # The same rules about trailing "/" apply to ScriptAlias directives as to
#---- # Alias.
#---- #
#---- ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
#----
#---- #
#---- # "/var/www/cgi-bin" should be changed to whatever your ScriptAliased
#---- # CGI directory exists, if you have that configured.
#---- #
#---- <Directory "/var/www/cgi-bin">
#---- AllowOverride None
#---- Options None
#---- Order allow,deny
#---- Allow from all
#---- </Directory>
#----
#---- こうする
#---- ##
#---- ## ScriptAlias: This controls which directories contain server scripts.
#---- ## ScriptAliases are essentially the same as Aliases, except that
#---- ## documents in the realname directory are treated as applications and
#---- ## run by the server when requested rather than as documents sent to the client.
#---- ## The same rules about trailing "/" apply to ScriptAlias directives as to
#---- ## Alias.
#---- ##
#---- #ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
#---- #
#---- ##
#---- ## "/var/www/cgi-bin" should be changed to whatever your ScriptAliased
#---- ## CGI directory exists, if you have that configured.
#---- ##
#---- #<Directory "/var/www/cgi-bin">
#---- # AllowOverride None
#---- # Options None
#---- # Order allow,deny
#---- # Allow from all
#---- #</Directory>
#---- 言語設定のUTF-8固定を無効にする
#----
#---- ここを
#---- AddDefaultCharset UTF-8
#----
#---- こうする
#---- #AddDefaultCharset UTF-8
#---- AddDefaultCharset Off
#---- 最終行に、バーチャルホスト用のディレクトリをincludeする設定を書く
#----
#---- Include conf/vconf.d/*.conf
ここまで終わったらhttpd.confを保存します。
■ vconf.d 作成
[root@hoge conf]# pwd
/etc/httpd/conf
[root@hoge conf]# mkdir vconf.d
■ vconf.d にダミー用ホストのconfigを書く
[root@hoge conf]# cd vconf.d
[root@hoge vconf.d]# vi www.example.com.conf
<VirtualHost 192.168.0.110:80>
DocumentRoot /home/vhost/www.example.com/html
ServerName www.example.com
ErrorLog /home/vhost/www.example.com/logs/error.log
CustomLog /home/vhost/www.example.com/logs/access.log combined
<Directory /home/vhost/www.example.com/html>
Options Indexes FollowSymlinks MultiViews
AllowOverride Fileinfo AuthConfig
#AllowOverride All
order allow,deny
Allow from all
</Directory>
ScriptAlias /cgi-bin /home/vhost/www.example.com/cgi-bin
<Directory /home/vhost/www.example.com/cgi-bin>
Options ExecCGI
AllowOverride Fileinfo AuthConfig
order allow,deny
Allow from all
</Directory>
</VirtualHost>
■ ダミー用ホストのコンテンツディレクトリにテストファイルを置く
[root@hoge vconf.d]# cd /home/vhost/www.example.com/
[root@hoge www.example.com]# basename `pwd` > html/index.html
[root@hoge www.example.com]# vi html/phpinfo.php
<?php
phpinfo();
?>
[root@hoge www.example.com]# cd cgi-bin/
[root@hoge cgi-bin]# vi test.cgi
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "<html><body>test</body></html>";
[root@hoge cgi-bin]# chmod 755 test.cgi
[root@hoge cgi-bin]# cd ../
[root@hoge www.example.com]# chown -R webmaster. *
■■ apacheの設定確認と起動
■ 設定確認
[root@hoge www.example.com]# cd
[root@hoge ~]# httpd -t -D DUMP_VHOSTS
VirtualHost configuration:
192.168.0.110:80 www.example.com (/etc/httpd/conf/vconf.d/www.example.com.conf:1)
wildcard NameVirtualHosts and _default_ servers:
_default_:443 hoge.example.com (/etc/httpd/conf.d/ssl.conf:88)
Syntax OK
■ 起動
[root@hoge ~]# /etc/init.d/httpd start
Starting httpd: [ OK ]
■ 自動起動設定
[root@hoge ~]# chkconfig httpd --list
httpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
[root@hoge ~]# chkconfig httpd on
[root@hoge ~]# chkconfig httpd --list
httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
■ エラーログ確認
[root@hoge ~]# cat /var/log/httpd/error_log
[Sun Feb 10 13:26:43 2008] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Sun Feb 10 13:26:44 2008] [notice] Digest: generating secret for digest authentication ...
[Sun Feb 10 13:26:44 2008] [notice] Digest: done
[Sun Feb 10 13:26:44 2008] [notice] LDAP: Built with OpenLDAP LDAP SDK
[Sun Feb 10 13:26:44 2008] [notice] LDAP: SSL support unavailable
[Sun Feb 10 13:26:45 2008] [notice] Apache configured -- resuming normal operations
■■ クライアントのHOSTSファイルで名前解決をして、ブラウザでアクセスする
[hostsへ以下のように書く]
192.168.0.2 www.example.com
[ブラウザで以下のURLにアクセスする]
http://www.example.com/
http://www.example.com/phpinfo.php
http://www.example.com/cgi-bin/test.cgi
今回作成するホスト www.example.com はバーチャルホストとして作ります。
そして、 www.example.com のFTPアカウントはMySQLで管理します。
今後、FTPアカウントの管理やバーチャルホストのconfigはプログラムにやらせたいなー。
■■ webスペースの領域作成
FTPアカウントは今後MySQLに管理させます。ここのUID/GIDは、UNIXアカウントとは別物です。
FTPアカウントをMySQLに管理させる方法は次のエントリに書きます。乞うご期待!
[root@hoge ~]# mkdir /home/vhost
[root@hoge ~]# mkdir -p /home/vhost/www.example.com/{html,cgi-bin,logs,auth}
[root@hoge ~]# chown -R 1000:1000 /home/vhost/
■■ apache インストール
[root@hoge ~]# yum install httpd mod_ssl
(中略)
Dependencies Resolved
=============================================================================
Package Arch Version Repository Size
=============================================================================
Installing:
httpd i386 2.0.52-38.ent.centos4.2 update 891 k
mod_ssl i386 1:2.0.52-38.ent.centos4.2 update 100 k
Installing for dependencies:
apr i386 0.9.4-24.9 base 93 k
apr-util i386 0.9.4-21 base 51 k
distcache i386 1.4.5-6 base 111 k
httpd-suexec i386 2.0.52-38.ent.centos4.2 update 30 k
Transaction Summary
=============================================================================
Install 6 Package(s)
Update 0 Package(s)
Remove 0 Package(s)
Total download size: 1.2 M
Is this ok [y/N]: y
■■ php5のインストール
通常、CentOS4.x系では、yumコマンドでphpをインストールしようとすると、
PHP4系がインストールされます。しかし、もうサポート終わってるので
(セキュリティサポートは2008年8月まで)
centosplusリポジトリを一時的に有効にしてやってPHP5をインストールしてやります。
[root@hoge ~]# yum --enablerepo=centosplus install php
(中略)
Dependencies Resolved
=============================================================================
Package Arch Version Repository Size
=============================================================================
Installing:
php i386 5.1.6-3.el4s1.8 centosplus 1.1 M
Installing for dependencies:
curl i386 7.12.1-11.el4 base 230 k
libidn i386 0.5.6-1 base 169 k
php-cli i386 5.1.6-3.el4s1.8 centosplus 2.0 M
php-common i386 5.1.6-3.el4s1.8 centosplus 136 k
Transaction Summary
=============================================================================
Install 5 Package(s)
Update 0 Package(s)
Remove 0 Package(s)
Total download size: 3.7 M
Is this ok [y/N]: y
■ さらに、pearもcentosplus経由でインストールする
[root@hoge ~]# yum --enablerepo=centosplus install php-pear
(中略)
Dependencies Resolved
=============================================================================
Package Arch Version Repository Size
=============================================================================
Installing:
php-pear noarch 1:1.4.11-1.el4s1.1 centosplus 345 k
Transaction Summary
=============================================================================
Install 1 Package(s)
Update 0 Package(s)
Remove 0 Package(s)
Total download size: 345 k
Is this ok [y/N]: y
■ pearが有効になっているか確認する
[root@hoge ~]# pear list
Installed packages, channel pear.php.net:
=========================================
Package Version State
Archive_Tar 1.3.1 stable
Console_Getopt 1.2 stable
PEAR 1.4.11 stable
XML_RPC 1.5.1 stable
■■ apacheの設定を修正する
■ httpd.confを修正する
[root@hoge ~]# cd /etc/httpd/conf
[root@hoge conf]# cp -p httpd.conf httpd.conf.orig
[root@hoge conf]# vi httpd.conf
#---- ServerTokensディレクティブでの表示を最小限にするため
#---- ここを
#---- ServerTokens OS
#----
#---- こうする
#---- #ServerTokens OS
#---- ServerTokens Prod
#---- サーバ管理者のメールアドレスを変更するため
#---- ここを
#---- ServerAdmin root@localhost
#----
#---- こうする
#---- #ServerAdmin root@localhost
#---- ServerAdmin webmaster@hoge.example.com
#---- すべてvirtualhostで管理するので、以下をコメントアウトする
#----
#---- ここを
#---- DocumentRoot "/var/www/html"
#---- こうする
#---- #DocumentRoot "/var/www/html"
#----
#---- ここを
#---- <Directory />
#---- Options FollowSymLinks
#---- AllowOverride None
#---- </Directory>
#----
#---- こうする
#---- #<Directory />
#---- # Options FollowSymLinks
#---- # AllowOverride None
#---- #</Directory>
#----
#---- ここを
#---- <Directory "/var/www/html">
#----
#---- #
#---- # Possible values for the Options directive are "None", "All",
#---- # or any combination of:
#---- # Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#---- #
#---- # Note that "MultiViews" must be named *explicitly* --- "Options All"
#---- # doesn't give it to you.
#---- #
#---- # The Options directive is both complicated and important. Please see
#---- # http://httpd.apache.org/docs-2.0/mod/core.html#options
#---- # for more information.
#---- #
#---- Options Indexes FollowSymLinks
#----
#---- #
#---- # AllowOverride controls what directives may be placed in .htaccess files.
#---- # It can be "All", "None", or any combination of the keywords:
#---- # Options FileInfo AuthConfig Limit
#---- #
#---- AllowOverride None
#----
#---- #
#---- # Controls who can get stuff from this server.
#---- #
#---- Order allow,deny
#---- Allow from all
#----
#---- </Directory>
#----
#---- こうする
#---- ##### comented by nullpopopo 2008/02/10
#---- #<Directory "/var/www/html">
#---- #
#---- ##
#---- ## Possible values for the Options directive are "None", "All",
#---- ## or any combination of:
#---- ## Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#---- ##
#---- ## Note that "MultiViews" must be named *explicitly* --- "Options All"
#---- ## doesn't give it to you.
#---- ##
#---- ## The Options directive is both complicated and important. Please see
#---- ## http://httpd.apache.org/docs-2.0/mod/core.html#options
#---- ## for more information.
#---- ##
#---- # Options Indexes FollowSymLinks
#---- #
#---- ##
#---- ## AllowOverride controls what directives may be placed in .htaccess files.
#---- ## It can be "All", "None", or any combination of the keywords:
#---- ## Options FileInfo AuthConfig Limit
#---- ##
#---- # AllowOverride None
#---- #
#---- ##
#---- ## Controls who can get stuff from this server.
#---- ##
#---- # Order allow,deny
#---- # Allow from all
#---- #
#---- #</Directory>
#---- userdirを使わないので無効にする
#----
#---- ここを
#---- <IfModule mod_userdir.c>
#---- #
#---- # UserDir is disabled by default since it can confirm the presence
#---- # of a username on the system (depending on home directory
#---- # permissions).
#---- #
#---- UserDir disable
#----
#---- #
#---- # To enable requests to /~user/ to serve the user's public_html
#---- # directory, remove the "UserDir disable" line above, and uncomment
#---- # the following line instead:
#---- #
#---- #UserDir public_html
#----
#---- </IfModule>
#----
#---- こうする
#---- ##### comented by nullpopopo 2008/02/10
#---- #<IfModule mod_userdir.c>
#---- # #
#---- # # UserDir is disabled by default since it can confirm the presence
#---- # # of a username on the system (depending on home directory
#---- # # permissions).
#---- # #
#---- # UserDir disable
#---- #
#---- # #
#---- # # To enable requests to /~user/ to serve the user's public_html
#---- # # directory, remove the "UserDir disable" line above, and uncomment
#---- # # the following line instead:
#---- # #
#---- # #UserDir public_html
#---- #
#---- #</IfModule>
#----
#---- ServerSignatureをOffにしてApache が生成したドキュメント中の情報を抑制する
#----
#---- ここを
#---- ServerSignature On
#----
#---- こうする
#---- #ServerSignature On
#---- ServerSignature Off
#---- WebDAVを使わないので無効にする
#----
#---- ここを
#---- #
#---- # WebDAV module configuration section.
#---- #
#---- <IfModule mod_dav_fs.c>
#---- # Location of the WebDAV lock database.
#---- DAVLockDB /var/lib/dav/lockdb
#---- </IfModule>
#----
#---- こうする
#---- ##
#---- ## WebDAV module configuration section.
#---- ##
#---- #<IfModule mod_dav_fs.c>
#---- # # Location of the WebDAV lock database.
#---- # DAVLockDB /var/lib/dav/lockdb
#---- #</IfModule>
#---- /var/www/cgi-bin/ を使わないので無効にする
#----
#---- ここを
#---- #
#---- # ScriptAlias: This controls which directories contain server scripts.
#---- # ScriptAliases are essentially the same as Aliases, except that
#---- # documents in the realname directory are treated as applications and
#---- # run by the server when requested rather than as documents sent to the client.
#---- # The same rules about trailing "/" apply to ScriptAlias directives as to
#---- # Alias.
#---- #
#---- ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
#----
#---- #
#---- # "/var/www/cgi-bin" should be changed to whatever your ScriptAliased
#---- # CGI directory exists, if you have that configured.
#---- #
#---- <Directory "/var/www/cgi-bin">
#---- AllowOverride None
#---- Options None
#---- Order allow,deny
#---- Allow from all
#---- </Directory>
#----
#---- こうする
#---- ##
#---- ## ScriptAlias: This controls which directories contain server scripts.
#---- ## ScriptAliases are essentially the same as Aliases, except that
#---- ## documents in the realname directory are treated as applications and
#---- ## run by the server when requested rather than as documents sent to the client.
#---- ## The same rules about trailing "/" apply to ScriptAlias directives as to
#---- ## Alias.
#---- ##
#---- #ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
#---- #
#---- ##
#---- ## "/var/www/cgi-bin" should be changed to whatever your ScriptAliased
#---- ## CGI directory exists, if you have that configured.
#---- ##
#---- #<Directory "/var/www/cgi-bin">
#---- # AllowOverride None
#---- # Options None
#---- # Order allow,deny
#---- # Allow from all
#---- #</Directory>
#---- 言語設定のUTF-8固定を無効にする
#----
#---- ここを
#---- AddDefaultCharset UTF-8
#----
#---- こうする
#---- #AddDefaultCharset UTF-8
#---- AddDefaultCharset Off
#---- 最終行に、バーチャルホスト用のディレクトリをincludeする設定を書く
#----
#---- Include conf/vconf.d/*.conf
ここまで終わったらhttpd.confを保存します。
■ vconf.d 作成
[root@hoge conf]# pwd
/etc/httpd/conf
[root@hoge conf]# mkdir vconf.d
■ vconf.d にダミー用ホストのconfigを書く
[root@hoge conf]# cd vconf.d
[root@hoge vconf.d]# vi www.example.com.conf
<VirtualHost 192.168.0.110:80>
DocumentRoot /home/vhost/www.example.com/html
ServerName www.example.com
ErrorLog /home/vhost/www.example.com/logs/error.log
CustomLog /home/vhost/www.example.com/logs/access.log combined
<Directory /home/vhost/www.example.com/html>
Options Indexes FollowSymlinks MultiViews
AllowOverride Fileinfo AuthConfig
#AllowOverride All
order allow,deny
Allow from all
</Directory>
ScriptAlias /cgi-bin /home/vhost/www.example.com/cgi-bin
<Directory /home/vhost/www.example.com/cgi-bin>
Options ExecCGI
AllowOverride Fileinfo AuthConfig
order allow,deny
Allow from all
</Directory>
</VirtualHost>
■ ダミー用ホストのコンテンツディレクトリにテストファイルを置く
[root@hoge vconf.d]# cd /home/vhost/www.example.com/
[root@hoge www.example.com]# basename `pwd` > html/index.html
[root@hoge www.example.com]# vi html/phpinfo.php
<?php
phpinfo();
?>
[root@hoge www.example.com]# cd cgi-bin/
[root@hoge cgi-bin]# vi test.cgi
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "<html><body>test</body></html>";
[root@hoge cgi-bin]# chmod 755 test.cgi
[root@hoge cgi-bin]# cd ../
[root@hoge www.example.com]# chown -R webmaster. *
■■ apacheの設定確認と起動
■ 設定確認
[root@hoge www.example.com]# cd
[root@hoge ~]# httpd -t -D DUMP_VHOSTS
VirtualHost configuration:
192.168.0.110:80 www.example.com (/etc/httpd/conf/vconf.d/www.example.com.conf:1)
wildcard NameVirtualHosts and _default_ servers:
_default_:443 hoge.example.com (/etc/httpd/conf.d/ssl.conf:88)
Syntax OK
■ 起動
[root@hoge ~]# /etc/init.d/httpd start
Starting httpd: [ OK ]
■ 自動起動設定
[root@hoge ~]# chkconfig httpd --list
httpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
[root@hoge ~]# chkconfig httpd on
[root@hoge ~]# chkconfig httpd --list
httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
■ エラーログ確認
[root@hoge ~]# cat /var/log/httpd/error_log
[Sun Feb 10 13:26:43 2008] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Sun Feb 10 13:26:44 2008] [notice] Digest: generating secret for digest authentication ...
[Sun Feb 10 13:26:44 2008] [notice] Digest: done
[Sun Feb 10 13:26:44 2008] [notice] LDAP: Built with OpenLDAP LDAP SDK
[Sun Feb 10 13:26:44 2008] [notice] LDAP: SSL support unavailable
[Sun Feb 10 13:26:45 2008] [notice] Apache configured -- resuming normal operations
■■ クライアントのHOSTSファイルで名前解決をして、ブラウザでアクセスする
[hostsへ以下のように書く]
192.168.0.2 www.example.com
[ブラウザで以下のURLにアクセスする]
http://www.example.com/
http://www.example.com/phpinfo.php
http://www.example.com/cgi-bin/test.cgi
先日、珠玉のエロ画像をどうにかして死守しなければと思った (っ´∀`)っ ゃー です、こんばんは。
前回のエントリーで、sambaの共有ディレクトリ以外をローカルでバックアップしたのですが、
やはり珠玉のエロ画像もバックアップしたいし、ローカルに取ったバックアップだけじゃ、そのハードディスクが
おっ死んでしまったら目もあてられないので、バックアップサーバを1台作ってそこにrsyncでスッ飛ばすことにしました。
rsyncでスッ飛ばす利点としては、
1) 初回転送時だけ時間がかかるが、2回目以降は差分のみの転送なので動きが軽い
2) パスフレーズなしの鍵を使ったsshと組み合わせることで、安全かつ楽に転送ができる
でしょう。以下、intra1サーバ(エロ画像ディレクトリがある方。以下バックアップ元)
からバックアップサーバへバックアップを取る作業のメモ書きです。
■■ バックアップ元で鍵を作成する
ホームディレクトリの下に「.ssh」ディレクトリがなければ作成してください。
「.ssh」ディレクトリのパーミッションは700にしてください。
[root@intra1 ~]# cd .ssh/
[root@intra1 .ssh]# ssh-keygen -t rsa -f rsync
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): ← エンターを空打ちします
Enter same passphrase again: ← ここでもエンターを空打ちします
Your identification has been saved in rsync.
Your public key has been saved in rsync.pub.
The key fingerprint is:
17:4c:63:65:b5:54:a5:d0:0f:ea:f1:61:0c:07:e5:03 root@intra1.stellarcube.com
■■ バックアップサーバへ鍵を送る
[root@intra1 .ssh]# scp rsync.pub root@backup:/root/.ssh/
The authenticity of host 'backup (192.168.0.200)' can't be established.
RSA key fingerprint is f6:87:ab:5a:e4:7c:6c:ec:91:71:3f:28:9c:01:c6:0d.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'backup,192.168.0.200' (RSA) to the list of known hosts.
root@backup's password:
rsync.pub 100% 237 0.2KB/s 00:00
■■ バックアップサーバで鍵を登録する
[root@backup ~]# cd .ssh/
[root@backup .ssh]# cat rsync.pub > authorized_keys
■■ バックアップ元からバックアップサーバへログインしてみる
[root@intra1 .ssh]# ssh -i ./rsync backup
ここでパスフレーズなしでログインできれば、ひとまずはOK。
■■ バックアップサーバ側にて、鍵ログインで行えるコマンドを制限する
[root@backup .ssh]# vi authorized_keys
ssh-rsa AAAAB3NzaC1yc2E~~~
で始まる行を
command="ls" ssh-rsa AAAAB3~~~
に変更する。
■■ 再度バックアップ元からバックアップサーバへログインしてみる
[root@intra1 .ssh]# ssh -i ./rsync backup
anaconda-ks.cfg backup bin install.log install.log.syslog
Connection to backup closed.
バックアップサーバの/rootディレクトリでlsコマンドを実行した結果が
バックアップ元で表示されれば、ひとまずはOK。
■■ バックアップサーバにおいて、rsyncのみを許可する
バックアップ元からなんでもかんでもコマンドを実行できてしまったら、
バックアップ元サーバが何らかの手段で乗っ取られた場合、即ち
バックアップサーバも自在に操られる手段を提供してしまうことになります。
よって、バックアップサーバではrsyncのみを許可することにしましょう。
まずは、コマンドレベルでの制限を行うスクリプトを書いてやります。
[root@backup .ssh]# cd ~/bin/
[root@backup bin]# touch validate-rsync.sh
[root@backup bin]# chmod 700 validate-rsync.sh
[root@backup bin]# vi validate-rsync.sh
#!/bin/sh
case "$SSH_ORIGINAL_COMMAND" in
*\&*)
echo "Rejected"
;;
*\;*)
echo "Rejected"
;;
rsync\ --server*)
$SSH_ORIGINAL_COMMAND
;;
*)
echo "Rejected"
;;
esac
■ authorized_keys ファイルを修正する
[root@backup bin]# cd ~/.ssh/
[root@backup .ssh]# vi authorized_keys
ここを
command="ls" ssh-rsa AAAAB3N~~~
こうする
command="/root/bin/validate-rsync.sh" ssh-rsa AAAAB3N~~~
■ sshd_configを修正する
[root@backup .ssh]# cd /etc/ssh/
[root@backup ssh]# cp -p sshd_config sshd_config.orig
[root@backup ssh]# vi sshd_config
ここを
#PermitRootLogin yes
こうする
#PermitRootLogin yes
PermitRootLogin forced-commands-only
■ sshdをreloadする
[root@backup ssh]# /etc/init.d/sshd reload
Reloading sshd: [ OK ]
■■ 再度バックアップ元からバックアップサーバへログインを試みる
[root@intra1 ~]# ssh -i ./.ssh/rsync backup
Rejected
Connection to backup closed.
接続が拒絶されたので、OK。
■■ バックアップ元からバックアップサーバへrsyncの試験をする
■ バックアップサーバで適当なディレクトリを作る
[root@backup ~]# mkdir tmp
[root@backup ~]# cd tmp/
■ バックアップ元からrsyncで転送をかける
[root@intra1 ~]# cd tmp/
[root@intra1 tmp]# touch hoge
[root@intra1 ~]# rsync -auzv --delete -e 'ssh -i /root/.ssh/rsync' /root/tmp/ root@backup:/root/tmp/
building file list ... done
./
hoge
sent 95 bytes received 40 bytes 270.00 bytes/sec
total size is 0 speedup is 0.00
■ ファイルが転送されたことをバックアップサーバで確認
[root@backup tmp]# ll
total 0
-rw-r--r-- 1 root root 0 Feb 3 03:48 hoge
■ バックアップ元でファイルの更新をしてからrsyncで転送をかける
[root@intra1 tmp]# echo hoge > hoge
[root@intra1 tmp]# rsync -auzv --delete -e 'ssh -i /root/.ssh/rsync' /root/tmp/ root@backup:/root/tmp/
building file list ... done
hoge
sent 108 bytes received 40 bytes 98.67 bytes/sec
total size is 5 speedup is 0.03
■ 更新されたファイルがバックアップサーバにあることを確認する
[root@backup tmp]# ll
total 4
-rw-r--r-- 1 root root 5 Feb 3 03:51 hoge
[root@backup tmp]# cat hoge
hoge
■ バックアップ元で何もファイルの更新をせずにrsyncで転送をかける
[root@intra1 tmp]# rsync -auzv --delete -e 'ssh -i /root/.ssh/rsync' /root/tmp/ root@backup:/root/tmp/
building file list ... done
sent 62 bytes received 20 bytes 54.67 bytes/sec
total size is 5 speedup is 0.06
■ バックアップサーバにあるファイルに何も更新がかかっていないことを確認する
[root@backup tmp]# ll
total 4
-rw-r--r-- 1 root root 5 Feb 3 03:51 hoge
■ バックアップ元でファイルを削除してからrsyncで転送をかける
[root@intra1 tmp]# rm -f hoge
[root@intra1 tmp]# rsync -auzv --delete -e 'ssh -i /root/.ssh/rsync' /root/tmp/ root@backup:/root/tmp/
building file list ... done
deleting hoge
./
sent 44 bytes received 20 bytes 128.00 bytes/sec
total size is 0 speedup is 0.00
■ バックアップサーバでもファイルが削除されたことを確認する
[root@backup tmp]# ll
total 0
■■ 本番運用準備
■ バックアップサーバ側での受け入れ態勢を作る
[root@backup ~]# mkdir -p /home/backup/intra1/{home,etc,root}
■ 初回バックアップを行う (50GBを超える分量なので半日程度かかる)
[root@intra1 ~]# rsync -auzv --delete --exclude=backup --exclude=shared\/isos --exclude=munin\/ \
-e 'ssh -i /root/.ssh/rsync' /home/ root@backup:/home/backup/intra1/home/
[root@intra1 ~]# rsync -auzv --delete -e 'ssh -i /root/.ssh/rsync' /etc/ root@backup:/home/backup/intra1/etc/
[root@intra1 ~]# rsync -auzv --delete -e 'ssh -i /root/.ssh/rsync' /root/ root@backup:/home/backup/intra1/root/
■ バックアップ元でスクリプトを書く
[root@intra1 ~]# cd bin/backup_pg/
[root@intra1 backup_pg]# touch intra1_backup.sh
[root@intra1 backup_pg]# chmod 755 intra1_backup.sh
[root@intra1 backup_pg]# vi intra1_backup.sh
#!/bin/sh
BPATH=root@backup:/home/backup/intra1
HR="============================================================"
echo $HR
echo
echo "intra1 /home backup"
echo
rsync -auzv --delete --exclude=backup --exclude=shared\/isos --exclude=munin\/ \
-e 'ssh -i /root/.ssh/rsync' /home/ $BPATH/home/
echo
echo $HR
echo
echo "intra1 /etc backup"
echo
rsync -auzv --delete -e 'ssh -i /root/.ssh/rsync' /etc/ $BPATH/etc/
echo
echo $HR
echo
echo "intra1 /root backup"
echo
rsync -auzv --delete -e 'ssh -i /root/.ssh/rsync' /root/ $BPATH/root/
echo
echo $HR
■■ cronで自動実行の運用にのせる
[root@intra1 ~]# cd /etc/cron.d
[root@intra1 cron.d]# vi intra1_backup
00 06 * * * root /root/bin/backup_pg/intra1_backup.sh | mail -s "[$HOSTNAME] `date` intra1_backup" root
以上で終了です。
ね、簡単でしょ?
前回のエントリーで、sambaの共有ディレクトリ以外をローカルでバックアップしたのですが、
やはり珠玉のエロ画像もバックアップしたいし、ローカルに取ったバックアップだけじゃ、そのハードディスクが
おっ死んでしまったら目もあてられないので、バックアップサーバを1台作ってそこにrsyncでスッ飛ばすことにしました。
rsyncでスッ飛ばす利点としては、
1) 初回転送時だけ時間がかかるが、2回目以降は差分のみの転送なので動きが軽い
2) パスフレーズなしの鍵を使ったsshと組み合わせることで、安全かつ楽に転送ができる
でしょう。以下、intra1サーバ(エロ画像ディレクトリがある方。以下バックアップ元)
からバックアップサーバへバックアップを取る作業のメモ書きです。
■■ バックアップ元で鍵を作成する
ホームディレクトリの下に「.ssh」ディレクトリがなければ作成してください。
「.ssh」ディレクトリのパーミッションは700にしてください。
[root@intra1 ~]# cd .ssh/
[root@intra1 .ssh]# ssh-keygen -t rsa -f rsync
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): ← エンターを空打ちします
Enter same passphrase again: ← ここでもエンターを空打ちします
Your identification has been saved in rsync.
Your public key has been saved in rsync.pub.
The key fingerprint is:
17:4c:63:65:b5:54:a5:d0:0f:ea:f1:61:0c:07:e5:03 root@intra1.stellarcube.com
■■ バックアップサーバへ鍵を送る
[root@intra1 .ssh]# scp rsync.pub root@backup:/root/.ssh/
The authenticity of host 'backup (192.168.0.200)' can't be established.
RSA key fingerprint is f6:87:ab:5a:e4:7c:6c:ec:91:71:3f:28:9c:01:c6:0d.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'backup,192.168.0.200' (RSA) to the list of known hosts.
root@backup's password:
rsync.pub 100% 237 0.2KB/s 00:00
■■ バックアップサーバで鍵を登録する
[root@backup ~]# cd .ssh/
[root@backup .ssh]# cat rsync.pub > authorized_keys
■■ バックアップ元からバックアップサーバへログインしてみる
[root@intra1 .ssh]# ssh -i ./rsync backup
ここでパスフレーズなしでログインできれば、ひとまずはOK。
■■ バックアップサーバ側にて、鍵ログインで行えるコマンドを制限する
[root@backup .ssh]# vi authorized_keys
ssh-rsa AAAAB3NzaC1yc2E~~~
で始まる行を
command="ls" ssh-rsa AAAAB3~~~
に変更する。
■■ 再度バックアップ元からバックアップサーバへログインしてみる
[root@intra1 .ssh]# ssh -i ./rsync backup
anaconda-ks.cfg backup bin install.log install.log.syslog
Connection to backup closed.
バックアップサーバの/rootディレクトリでlsコマンドを実行した結果が
バックアップ元で表示されれば、ひとまずはOK。
■■ バックアップサーバにおいて、rsyncのみを許可する
バックアップ元からなんでもかんでもコマンドを実行できてしまったら、
バックアップ元サーバが何らかの手段で乗っ取られた場合、即ち
バックアップサーバも自在に操られる手段を提供してしまうことになります。
よって、バックアップサーバではrsyncのみを許可することにしましょう。
まずは、コマンドレベルでの制限を行うスクリプトを書いてやります。
[root@backup .ssh]# cd ~/bin/
[root@backup bin]# touch validate-rsync.sh
[root@backup bin]# chmod 700 validate-rsync.sh
[root@backup bin]# vi validate-rsync.sh
#!/bin/sh
case "$SSH_ORIGINAL_COMMAND" in
*\&*)
echo "Rejected"
;;
*\;*)
echo "Rejected"
;;
rsync\ --server*)
$SSH_ORIGINAL_COMMAND
;;
*)
echo "Rejected"
;;
esac
■ authorized_keys ファイルを修正する
[root@backup bin]# cd ~/.ssh/
[root@backup .ssh]# vi authorized_keys
ここを
command="ls" ssh-rsa AAAAB3N~~~
こうする
command="/root/bin/validate-rsync.sh" ssh-rsa AAAAB3N~~~
■ sshd_configを修正する
[root@backup .ssh]# cd /etc/ssh/
[root@backup ssh]# cp -p sshd_config sshd_config.orig
[root@backup ssh]# vi sshd_config
ここを
#PermitRootLogin yes
こうする
#PermitRootLogin yes
PermitRootLogin forced-commands-only
■ sshdをreloadする
[root@backup ssh]# /etc/init.d/sshd reload
Reloading sshd: [ OK ]
■■ 再度バックアップ元からバックアップサーバへログインを試みる
[root@intra1 ~]# ssh -i ./.ssh/rsync backup
Rejected
Connection to backup closed.
接続が拒絶されたので、OK。
■■ バックアップ元からバックアップサーバへrsyncの試験をする
■ バックアップサーバで適当なディレクトリを作る
[root@backup ~]# mkdir tmp
[root@backup ~]# cd tmp/
■ バックアップ元からrsyncで転送をかける
[root@intra1 ~]# cd tmp/
[root@intra1 tmp]# touch hoge
[root@intra1 ~]# rsync -auzv --delete -e 'ssh -i /root/.ssh/rsync' /root/tmp/ root@backup:/root/tmp/
building file list ... done
./
hoge
sent 95 bytes received 40 bytes 270.00 bytes/sec
total size is 0 speedup is 0.00
■ ファイルが転送されたことをバックアップサーバで確認
[root@backup tmp]# ll
total 0
-rw-r--r-- 1 root root 0 Feb 3 03:48 hoge
■ バックアップ元でファイルの更新をしてからrsyncで転送をかける
[root@intra1 tmp]# echo hoge > hoge
[root@intra1 tmp]# rsync -auzv --delete -e 'ssh -i /root/.ssh/rsync' /root/tmp/ root@backup:/root/tmp/
building file list ... done
hoge
sent 108 bytes received 40 bytes 98.67 bytes/sec
total size is 5 speedup is 0.03
■ 更新されたファイルがバックアップサーバにあることを確認する
[root@backup tmp]# ll
total 4
-rw-r--r-- 1 root root 5 Feb 3 03:51 hoge
[root@backup tmp]# cat hoge
hoge
■ バックアップ元で何もファイルの更新をせずにrsyncで転送をかける
[root@intra1 tmp]# rsync -auzv --delete -e 'ssh -i /root/.ssh/rsync' /root/tmp/ root@backup:/root/tmp/
building file list ... done
sent 62 bytes received 20 bytes 54.67 bytes/sec
total size is 5 speedup is 0.06
■ バックアップサーバにあるファイルに何も更新がかかっていないことを確認する
[root@backup tmp]# ll
total 4
-rw-r--r-- 1 root root 5 Feb 3 03:51 hoge
■ バックアップ元でファイルを削除してからrsyncで転送をかける
[root@intra1 tmp]# rm -f hoge
[root@intra1 tmp]# rsync -auzv --delete -e 'ssh -i /root/.ssh/rsync' /root/tmp/ root@backup:/root/tmp/
building file list ... done
deleting hoge
./
sent 44 bytes received 20 bytes 128.00 bytes/sec
total size is 0 speedup is 0.00
■ バックアップサーバでもファイルが削除されたことを確認する
[root@backup tmp]# ll
total 0
■■ 本番運用準備
■ バックアップサーバ側での受け入れ態勢を作る
[root@backup ~]# mkdir -p /home/backup/intra1/{home,etc,root}
■ 初回バックアップを行う (50GBを超える分量なので半日程度かかる)
[root@intra1 ~]# rsync -auzv --delete --exclude=backup --exclude=shared\/isos --exclude=munin\/ \
-e 'ssh -i /root/.ssh/rsync' /home/ root@backup:/home/backup/intra1/home/
[root@intra1 ~]# rsync -auzv --delete -e 'ssh -i /root/.ssh/rsync' /etc/ root@backup:/home/backup/intra1/etc/
[root@intra1 ~]# rsync -auzv --delete -e 'ssh -i /root/.ssh/rsync' /root/ root@backup:/home/backup/intra1/root/
■ バックアップ元でスクリプトを書く
[root@intra1 ~]# cd bin/backup_pg/
[root@intra1 backup_pg]# touch intra1_backup.sh
[root@intra1 backup_pg]# chmod 755 intra1_backup.sh
[root@intra1 backup_pg]# vi intra1_backup.sh
#!/bin/sh
BPATH=root@backup:/home/backup/intra1
HR="============================================================"
echo $HR
echo
echo "intra1 /home backup"
echo
rsync -auzv --delete --exclude=backup --exclude=shared\/isos --exclude=munin\/ \
-e 'ssh -i /root/.ssh/rsync' /home/ $BPATH/home/
echo
echo $HR
echo
echo "intra1 /etc backup"
echo
rsync -auzv --delete -e 'ssh -i /root/.ssh/rsync' /etc/ $BPATH/etc/
echo
echo $HR
echo
echo "intra1 /root backup"
echo
rsync -auzv --delete -e 'ssh -i /root/.ssh/rsync' /root/ $BPATH/root/
echo
echo $HR
■■ cronで自動実行の運用にのせる
[root@intra1 ~]# cd /etc/cron.d
[root@intra1 cron.d]# vi intra1_backup
00 06 * * * root /root/bin/backup_pg/intra1_backup.sh | mail -s "[$HOSTNAME] `date` intra1_backup" root
以上で終了です。
ね、簡単でしょ?
先日、珠玉のエロ画像たちがなくなりかけて軽くショックだった (っ´∀`)っ ゃー ですこんばんは。
珠玉のエロ画像だけじゃなくて、やはりバックアップは大事なのです。というわけで、
作業ミスなどでうっかりファイルやディレクトリを消してしまっても大丈夫なように、
ローカルにバックアップをとることにしました。サーバ全体のバックアップはまた別のお話ということで、
まずはバックアップ対象を3世代ぶん、tar.gzで固めることにしました。
■■ 設計思想
・ バックアップ対象は、/home、/etc、/rootの3ディレクトリ
・ ただし、sambaで共有している領域は時間がかかるので除外する
(/home/shared がsambaで共有している領域)
・ また、バックアップディレクトリも対象から除外
■■ バックアップスクリプト記述
■ まずはスクリプトを置くディレクトリを作成
[root@intra1 ~]# mkdir -p bin/backup_pg
[root@intra1 ~]# cd bin/backup_pg
■ スクリプト記述
[root@intra1 backup_pg]# touch local_backup.sh
[root@intra1 backup_pg]# chmod 755 local_backup.sh
[root@intra1 backup_pg]# vi local_backup.sh
#!/bin/sh
# backup2local for home root etc.
BACKUPDIR=/home/backup/intra1
### バックアップディレクトリが存在しなかったら作成する
if test -d $BACKUPDIR/'(home|etc|root)'
then
:
else
mkdir -p $BACKUPDIR/{home,etc,root}
fi
### /homeディレクトリのうち、sharedとbackup以外を日付で3世代バックアップする.
### もし、4日前のファイル名のものがあったら削除する.
echo
echo "--------------------------------------------------------------------------------"
echo "/home backup"
echo
cd /home
for target_home in `ls /home|egrep -v '(shared|backup)'`
do
#変数の後の「_」はエスケープしてやらないとだめ
tar cvzf $BACKUPDIR/home/$target_home'_'`date +%Y%m%d`.tar.gz $target_home
chown shasta. $BACKUPDIR/home/$target_home'_'`date +%Y%m%d`.tar.gz
if test -f $BACKUPDIR/home/$target_home'_'`date +%Y%m%d -d '3day ago'`.tar.gz
then
rm -f $BACKUPDIR/home/$target_home'_'`date +%Y%m%d -d '3day ago'`.tar.gz
fi
done
### /etcディレクトリを日付で3世代バックアップする.
### もし、4日前のファイル名のものがあったら削除する.
echo
echo "--------------------------------------------------------------------------------"
echo "/etc backup"
echo
cd /etc
tar cvzf $BACKUPDIR/etc/etc_`date +%Y%m%d`.tar.gz .
chown root. $BACKUPDIR/etc/etc_`date +%Y%m%d`.tar.gz
chmod 600 $BACKUPDIR/etc/etc_`date +%Y%m%d`.tar.gz
if test -f $BACKUPDIR/etc/etc_`date +%Y%m%d -d '3day ago'`.tar.gz
then
rm -f $BACKUPDIR/etc/etc_`date +%Y%m%d -d '3day ago'`.tar.gz
fi
### /rootィレクトリを日付で3世代バックアップする.
### もし、4日前のファイル名のものがあったら削除する.
echo
echo "--------------------------------------------------------------------------------"
echo "/root backup"
echo
cd /root
tar cvzf $BACKUPDIR/root/root_`date +%Y%m%d`.tar.gz .
chown root. $BACKUPDIR/root/root_`date +%Y%m%d`.tar.gz
chmod 600 $BACKUPDIR/root/root_`date +%Y%m%d`.tar.gz
if test -f $BACKUPDIR/root/root_`date +%Y%m%d -d '3day ago'`.tar.gz
then
rm -f $BACKUPDIR/root/root_`date +%Y%m%d -d '3day ago'`.tar.gz
fi
ここまでできたら保存します。
■■ cronに自動実行登録
■ 毎朝5時に自動実行するように登録する
[root@intra1 backup_pg]# cd /etc/cron.d
[root@intra1 cron.d]# vi local_backup
00 05 * * * root /root/bin/backup_pg/local_backup.sh | mail -s "[$HOSTNAME] `date` local_backup" root
以上で終了です。
ね、簡単でしょ?
珠玉のエロ画像だけじゃなくて、やはりバックアップは大事なのです。というわけで、
作業ミスなどでうっかりファイルやディレクトリを消してしまっても大丈夫なように、
ローカルにバックアップをとることにしました。サーバ全体のバックアップはまた別のお話ということで、
まずはバックアップ対象を3世代ぶん、tar.gzで固めることにしました。
■■ 設計思想
・ バックアップ対象は、/home、/etc、/rootの3ディレクトリ
・ ただし、sambaで共有している領域は時間がかかるので除外する
(/home/shared がsambaで共有している領域)
・ また、バックアップディレクトリも対象から除外
■■ バックアップスクリプト記述
■ まずはスクリプトを置くディレクトリを作成
[root@intra1 ~]# mkdir -p bin/backup_pg
[root@intra1 ~]# cd bin/backup_pg
■ スクリプト記述
[root@intra1 backup_pg]# touch local_backup.sh
[root@intra1 backup_pg]# chmod 755 local_backup.sh
[root@intra1 backup_pg]# vi local_backup.sh
#!/bin/sh
# backup2local for home root etc.
BACKUPDIR=/home/backup/intra1
### バックアップディレクトリが存在しなかったら作成する
if test -d $BACKUPDIR/'(home|etc|root)'
then
:
else
mkdir -p $BACKUPDIR/{home,etc,root}
fi
### /homeディレクトリのうち、sharedとbackup以外を日付で3世代バックアップする.
### もし、4日前のファイル名のものがあったら削除する.
echo
echo "--------------------------------------------------------------------------------"
echo "/home backup"
echo
cd /home
for target_home in `ls /home|egrep -v '(shared|backup)'`
do
#変数の後の「_」はエスケープしてやらないとだめ
tar cvzf $BACKUPDIR/home/$target_home'_'`date +%Y%m%d`.tar.gz $target_home
chown shasta. $BACKUPDIR/home/$target_home'_'`date +%Y%m%d`.tar.gz
if test -f $BACKUPDIR/home/$target_home'_'`date +%Y%m%d -d '3day ago'`.tar.gz
then
rm -f $BACKUPDIR/home/$target_home'_'`date +%Y%m%d -d '3day ago'`.tar.gz
fi
done
### /etcディレクトリを日付で3世代バックアップする.
### もし、4日前のファイル名のものがあったら削除する.
echo
echo "--------------------------------------------------------------------------------"
echo "/etc backup"
echo
cd /etc
tar cvzf $BACKUPDIR/etc/etc_`date +%Y%m%d`.tar.gz .
chown root. $BACKUPDIR/etc/etc_`date +%Y%m%d`.tar.gz
chmod 600 $BACKUPDIR/etc/etc_`date +%Y%m%d`.tar.gz
if test -f $BACKUPDIR/etc/etc_`date +%Y%m%d -d '3day ago'`.tar.gz
then
rm -f $BACKUPDIR/etc/etc_`date +%Y%m%d -d '3day ago'`.tar.gz
fi
### /rootィレクトリを日付で3世代バックアップする.
### もし、4日前のファイル名のものがあったら削除する.
echo
echo "--------------------------------------------------------------------------------"
echo "/root backup"
echo
cd /root
tar cvzf $BACKUPDIR/root/root_`date +%Y%m%d`.tar.gz .
chown root. $BACKUPDIR/root/root_`date +%Y%m%d`.tar.gz
chmod 600 $BACKUPDIR/root/root_`date +%Y%m%d`.tar.gz
if test -f $BACKUPDIR/root/root_`date +%Y%m%d -d '3day ago'`.tar.gz
then
rm -f $BACKUPDIR/root/root_`date +%Y%m%d -d '3day ago'`.tar.gz
fi
ここまでできたら保存します。
■■ cronに自動実行登録
■ 毎朝5時に自動実行するように登録する
[root@intra1 backup_pg]# cd /etc/cron.d
[root@intra1 cron.d]# vi local_backup
00 05 * * * root /root/bin/backup_pg/local_backup.sh | mail -s "[$HOSTNAME] `date` local_backup" root
以上で終了です。
ね、簡単でしょ?
