■共用レンタルサーバー仕様にするシステム
アメブロなどブログサービスのようにユーザーに貸し出す場合です。
自社でブログサービス感覚で誰でも使えるシンプルな機能のCMSを作って
スタートアップ企業さんに提供していく
プロジェクトが始まったのでサーバーをこしらえました。
概要
具体的には以下のオリジナルコマンドでユーザーを追加
[bash] # chroot-share-useradd testuser[/bash]
※削除する場合は
[bash] # chroot-share-userdel testuser[/bash]
この作成されたtestuserは
・ftp通信でのアップロードが可能
・public_htmlにindex.htmlをアップロードすればWEBに反映
・MySQLデータベースも作る
・パスワードはランダムで自動生成を行いたい。
http://ドメイン名/testuser/
or
http://ドメイン名/testuser/index.html
でWEBの閲覧ができるようにする。
※scpがあるのだからftpの使用は控えたいものの
※WEB作成ソフトがsftpをサポートしていなかったりして
※ftpの要望ががが(˚ ˃̣̣̥᷄ω˂̣̣̥᷅ )
chrootユーザーのpublic_htmlにアクセスする為の設定を行います。
【Apacheの設定ファイル編集】
# vi /etc/httpd/conf/httpd.conf
#
# UserDir is disabled by default since it can confirm the presence
# of a username on the system (depending on home directory
# permissions).
#
UserDir disabled
#
# To enable requests to /~user/ to serve the user’s public_html
# directory, remove the “UserDir disabled” line above, and uncomment
# the following line instead:
#
#UserDir public_html
↓変更
#
# UserDir is disabled by default since it can confirm the presence
# of a username on the system (depending on home directory
# permissions).
#
UserDir disable
↓
#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
↓
UserDir public_html ← 行頭の#を削除(コメント解除)
AliasMatch ^/testuser(.*) /home/testuser/public_html/$1 ←testuserユーザーのみhttp://sysgcms.com/~testuser/のように~でアクセスできるようにする場合
AliasMatch ^/([^/]+)/(.*) /home/$1/public_html/$2←全てのユーザーでhttp://sysgcms.com/userdir/ユーザー名/でアクセスできるようにする場合
#
# Control access to UserDir directories. The following is an example
# for a site where these directories are restricted to read-only.
#
#
# AllowOverride FileInfo AuthConfig Limit
# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
# # Order allow,deny
# Allow from all
# # # Order deny,allow
# Deny from all
# #
※以下を追加します。
<Directory /home/*/public_html>
AllowOverride All
Options IncludesNoExec ExecCGI FollowSymLinks
<Limit GET POST OPTIONS>
Order allow,deny
Allow from all
</Limit>
<LimitExcept GET POST OPTIONS>
Order deny,allow
Deny from all
</LimitExcept>
</Directory>
[bash] [root@sysgcms yuu]# service httpd restart
httpd を停止中: [ OK ] httpd を起動中: [ OK ] [/bash]
※WEBサーバーのエラーメッセージについて
httpd を起動中: [Fri Dec 05 16:40:17 2014] [warn] The Alias directive in /etc/httpd/conf/httpd.conf at line 566 will probably never match because it overlaps an earlier AliasMatch.
※エラーが起こる場合はUserDirディレクティブを無効にして
※最終行に以下を貼り付ける、または最終行に移動させる。
#
# UserDir: The name of the directory that is appended onto a user’s home
# directory if a ~user request is received.
#
# The path to the end user account ‘public_html’ directory must be
# accessible to the webserver userid. This usually means that ~userid
# must have permissions of 711, ~userid/public_html must have permissions
# of 755, and documents contained therein must be world-readable.
# Otherwise, the client will only receive a “403 Forbidden” message.
#
# See also: http://httpd.apache.org/docs/misc/FAQ.html#forbidden
#
<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 disabled #
# To enable requests to /~user/ to serve the user’s public_html
# directory, remove the “UserDir disabled” line above, and uncomment
# the following line instead:
#
#UserDir public_html
AliasMatch ^/([^/]+)/(.*) /home/$1/public_html/$2
</IfModule>
#
# Control access to UserDir directories. The following is an example
# for a site where these directories are restricted to read-only.
#
#<Directory /home/*/public_html>
# AllowOverride FileInfo AuthConfig Limit
# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
# <Limit GET POST OPTIONS>
# Order allow,deny
# Allow from all
# </Limit>
# <LimitExcept GET POST OPTIONS>
# Order deny,allow
# Deny from all
# </LimitExcept>
#</Directory> <Directory /home/*/public_html>
AllowOverride All
Options IncludesNoExec ExecCGI FollowSymLinks
<Limit GET POST OPTIONS>
Order allow,deny
Allow from all
</Limit>
<LimitExcept GET POST OPTIONS>
Order deny,allow
Deny from all
</LimitExcept>
</Directory>
【設定を反映させます。】
[bash] # service httpd restart[/bash]
chroot共用ユーザ作成スクリプト作成
vstpd接続ができます。
mkpasswdコマンドを使いたいので
[bash]
# yum install expect
[/bash]
expectのインストールが必要です。
[bash] # vi /bin/chroot-share-useradd[/bash] [bash] #!/bin/bash
#
# Usage: ./chroot-share-useradd username [shell] #
###################################
#MySQLのrootパスワードを設定
MYSQLPASSWORD=MySQLのrootパスワード
###################################
## Here specify the apps you want into the enviroment
#CMD=”bash ls touch mkdir cp mv rm pwd chmod cat vi id rsync ssh scp sftp ping ssh-keygen perl”
#APPS=which $CMD
#APPS=”${APPS} /usr/libexec/openssh/sftp-server”
# Sanity check
if [ “$1” = “” ] ; then
echo ” Usage: ./chroot-useradd username [shell]”
exit 1
fi
# 追加するユーザー名を第1引数から取得して変数に代入
CHROOT_USERNAME=$1
#同名ユーザーがいたらスクリプトを停止させる。
if grep /etc/passwd -e “^$CHROOT_USERNAME” > /dev/null 2>&1 ; then
echo “There is already the same name of user”
exit
fi
if [ “$2” = “” ] ; then
useradd -s /sbin/nologin $CHROOT_USERNAME
else
useradd -s /sbin/nologin $2 $CHROOT_USERNAME
fi
# SSHログインのchroot設定
usermod -d /home/$CHROOT_USERNAME/./ $CHROOT_USERNAME
# 乱数でパスワードを自動設定する(長さ20文字、数字の数5、大文字3つ、記号なし)
PASSWORD=/usr/bin/mkpasswd -l 20 -d 5 -C 3 -s 0
#作成したパスワードをmd5でエンコードしてパスワードを設定する。
md5BASEPASS=/usr/bin/openssl passwd -1 ${PASSWORD}
/usr/sbin/usermod -p $md5BASEPASS $CHROOT_USERNAME
echo “ユーザー名:$CHROOT_USERNAME パスワード:$PASSWORD”
## パスワード設定を3回(default)ミスしたら作成したユーザーを消してスクリプト緊急停止。
#passwd $CHROOT_USERNAME
#if [ $? = 1 ] ; then
# chroot-share-userdel $CHROOT_USERNAME
# exit 1
#fi
chown $CHROOT_USERNAME /home/$CHROOT_USERNAME
chgrp $CHROOT_USERNAME /home/$CHROOT_USERNAME
rm -f /home/$CHROOT_USERNAME/.* > /dev/null 2>&1
#HOMEDIR=grep /etc/passwd -e "^$CHROOT_USERNAME" | cut -d':' -f 6
HOMEDIR=/home/$CHROOT_USERNAME/
cd $HOMEDIR
## Copy the apps and the related libs
#for prog in $APPS;
#do
# cp $prog ./$prog
# # obtain a list of related libraryes
# ldd $prog > /dev/null
# if [ “$?” = 0 ] ; then
# LIBS=ldd $prog | awk '{ print $3 }'
# for l in $LIBS;
# do
# mkdir -p ./dirname $l
> /dev/null 2>&1
# cp $l ./$l > /dev/null 2>&1
# done
# fi
#done
#vsftpdサーバに追加します。
#sftpが入っているので、vsftpdを使わないなら必要ないです。
# vsftpdユーザー内に登録ユーザーが存在していなければ登録する。
if ! grep -q $CHROOT_USERNAME /etc/vsftpd/user_list; then
echo $CHROOT_USERNAME >> /etc/vsftpd/user_list
fi
#設定反映
/etc/rc.d/init.d/vsftpd reload
# public_html作成
if [ ! -d /home/$CHROOT_USERNAME/public_html ]
then
mkdir /home/$CHROOT_USERNAME/public_html
chmod 755 /home/$CHROOT_USERNAME/public_html
fi
#public_htmlがWEBで公開出来るようにする
chmod 711 /home/$CHROOT_USERNAME
chmod 755 /home/$CHROOT_USERNAME/public_html
#不要なメールディレクトリを削除する
rm -rf /home/$CHROOT_USERNAME/Maildir
rm -rf /home/$CHROOT_USERNAME/var/spool/mail/$CHROOT_USERNAME
#MySQL DB作成
echo “DBを作成します。”
mysql -uroot -p$MYSQLPASSWORD -e “set password for $CHROOT_USERNAME@localhost=password(‘$PASSWORD’);”
mysql -uroot -p$MYSQLPASSWORD -e “create database $CHROOT_USERNAME;”
mysql -uroot -p$MYSQLPASSWORD -e “grant all privileges on $CHROOT_USERNAME.* to $CHROOT_USERNAME@localhost identified by ‘$PASSWORD’;”
echo “DB名:$CHROOT_USERNAME DBパスワード:$PASSWORD”
echo “正常にデータベースが作成されました。”
exit 0
[/bash]
【chrootユーザ環境作成スクリプトに実行権限付加】
[bash] [root@sysgcms ~]# chmod u+x /bin/chroot-share-useradd[/bash]
【chrootユーザ作成する】
[/bash]
chrootユーザ削除スクリプト作成
よくあるyes or no の対話型にしました。
[bash] # vi /sbin/chroot-share-userdel[/bash] [bash] #!/bin/bash
CHROOT_USERNAME=$1
echo $CHROOT_USERNAME” を削除してよろしいですか? [Y/n]”
read ANSWER
case $ANSWER in
“” | “Y” | “y” | “yes” | “Yes” | “YES” )
userdel -r $CHROOT_USERNAME > /dev/null 2>&1
rm -rf /home/$CHROOT_USERNAME
sed -i “/^$CHROOT_USERNAME$/d” /etc/vsftpd/user_list;;
* ) echo “NO!!”;;
esac
#MySQLのデータベースがあれば削除
echo “show databases;” | mysql -u root -p > chroot-userDB.txt
if grep chroot-userDB.txt -e “^$CHROOT_USERNAME” ;then
echo “drop database $CHROOT_USERNAME;” | mysql -u root -p
echo “DB名:$CHROOT_USERNAME を削除しました。”
fi
rm -f chroot-userDB.txt
[/bash]
→汎用性を考えると対話式は必要ありませんでした。
改めて。
#
# Usage: ./chroot-share-useradd username [削除するユーザー名] #
###################################
#MySQLのrootパスワードを設定
MYSQLPASSWORD=MySQLのrootパスワード
###################################
#引数のユーザー名
CHROOT_USERNAME=$1
userdel -r $CHROOT_USERNAME > /dev/null 2>&1
rm -rf /home/$CHROOT_USERNAME
sed -i “/^$CHROOT_USERNAME$/d” /etc/vsftpd/user_list
echo “ユーザー名:$CHROOT_USERNAME を削除しました。”
#MySQLのデータベースがあれば削除
mysql -uroot -p$MYSQLPASSWORD -e “show databases;” > chroot-userDB.txt
if grep chroot-userDB.txt -e “^$CHROOT_USERNAME” ;then
#echo “drop database $CHROOT_USERNAME;” | mysql -u root -p
mysql -uroot -p$MYSQLPASSWORD -e “drop database $CHROOT_USERNAME;”
echo “DB名:$CHROOT_USERNAME を削除しました。”
fi
rm -f chroot-userDB.txt
[/bash]
【実行権限付与】
[bash] # chmod +x /sbin/chroot-share-userdel[/bash]
【chrootユーザーを削除する】
[bash] # chroot-share-userdel 削除するユーザー名
[/bash]
【chrootユーザーを追加する】
[bash] # chroot-share-useradd 追加するユーザー名[/bash]
testuserのWEBディレクトリにアクセスする
[bash]# echo “testuserのページですー!” >> /home/testuser/public_html/index.html[/bash]
またはWinSCPやFFFTPなりでファイルをアップロードしてください。
ブラウザでアクセスしてね。
http://ドメイン/testuser/
見れるはずです。
この後はどうしよう・・?
いちいちサーバーにSSHで繋がなくても
PHPを使ってWEBページの会員入力からユーザーを
追加や削除なんて事もできちゃったりするんですー!
またCMSを制作していますので、ユーザー追加と同時に
データベースも作成されるようにスクリプトを調整していきます。
※手動で設定する場合
手動でsshには接続させない、vsftpdには接続可能なユーザーを作る。
[bash] [root@sysgcms yuu]# useradd -s /sbin/nologin testuser[/bash] [bash][root@sysgcms yuu]# passwd testuser[/bash] [bash][root@sysgcms yuu]# chmod 711 /home/testuser[/bash] [bash][root@sysgcms yuu]# vi /etc/vsftpd/user_list[/bash]名前を追加します。
[bash] [root@sysgcms yuu]# service vsftpd restartvsftpd を停止中: [ OK ] vsftpd 用の vsftpd を起動中: [ OK ] [/bash]
おまけ スクリプト解説
CHROOT_USERNAME=$1
//解説—————————–
$1は第1引数
$2は第2引数
# ./スクリプト taro yamada
この場合
$1はtaro
$2はyamada
//——————————–
# パスワード設定を3回(default)ミスしたら作成したユーザーを消してスクリプト緊急停止。
passwd $CHROOT_USERNAME
if [ $? = 1 ] ; then
chroot-share-userdel $CHROOT_USERNAME
exit 1
fi
//解説—————————–
$?は一行前の処理の結果の値を返す。
$? = 1//成功
$? = 0//失敗
exit 1 //失敗でスクリプト停止
//——————————–
#vsftpdサーバに追加します。
#sftpが入っているので、vsftpdを使わないなら必要ないです。
# vsftpdユーザー内に登録ユーザーが存在していなければ登録する。
if ! grep -q $CHROOT_USERNAME /etc/vsftpd/user_list; then
echo $CHROOT_USERNAME >> /etc/vsftpd/user_list
fi
#設定反映
/etc/rc.d/init.d/vsftpd reload
//解説—————————–
if 条件式 ; then
処理
fi
条件式が成立するなら処理を行う。
if ! 条件式 ; then
処理
fi
条件式が成立しないなら処理を行う
//——————————–
CHROOT_USERNAME=$1
echo $CHROOT_USERNAME” を削除してよろしいですか? [Y/n]”
read ANSWER
case $ANSWER in
“” | “Y” | “y” | “yes” | “Yes” | “YES” )
userdel -r $CHROOT_USERNAME > /dev/null 2>&1
rm -rf /home/$CHROOT_USERNAME
sed -i “/^$CHROOT_USERNAME$/d” /etc/vsftpd/user_list;;
* ) echo “NO!!”;;
esac
//解説—————————–
echo “何か入力してください”
read 変数
打ち込まれた値を変数に入れる。
case $ANSWER in
Aの場合 || Bの場合 )
AまたはBの場合の処理;;
Cの場合 )
Cを選んだ場合の処理;;
* ) AとBとCを除く全ての場合の処理;;
esac
//——————————–
userdel -r $CHROOT_USERNAME > /dev/null 2>&1
rm -rf /home/$CHROOT_USERNAME
sed -i “/^$CHROOT_USERNAME$/d” /etc/vsftpd/user_list
//解説—————————–
処理 > /dev/null 2>&1
処理の後に何もメッセージを出さないようにする。
sed -i “/^文字列/d” ファイルパス
文字列が完全に一致している行を削除
//——————————–