iOSのアプリ、PhotoSync なのだけど、色々と便利に使っている今日この頃、さらになんかできないかと設定を見ていてふと思った。
FTPサーバーにも接続できるみたいだし、オートトランスファー機能を使って半無限処理を実行してみようと思い立った。
PhotoSyncの細かい設定は今回は省くが、FTPサーバーとの通信設定とオートトランスファーの設定をしてしまえばWi-Fiに接続されて、特定の位置付近になれば自動的にサーバーにアップロードされる仕組み。

Wi-Fi接続ということで自宅のNASには宅内ということもあり、一番平易なFTP接続を行った。
これに関しては特筆すべきものは無いので割愛。

問題は、VPSの方。
本来はこんな用途には専用に用意するか、DropboxOneDriveなどのクラウドストレージを用意すればいいのだと思うのだけれど、VPSが思ったより容量が余っているので、そこにテストとして組み込んでみることにした。
FTPは、SFTP接続にしてセキュアな環境を保ち、chroot環境にしてホームディレクトリ以下は見れないようにした。
本当はシェルログインも殺してしまいたかったのだけれど、どうも上手くPhotoSyncが作動してくれなかったので、殺せなかった。
共有鍵ログインも行いたかったのだけれど、これは上手く動いたり動かなかったりと不安定だったため、不本意ながらパスワードログインにした。

というわけで、本題。
まずは、サーバーへのユーザー作成なのだが、chroot 環境を構築するので通常の useradd ではなく、カスタムしたスクリプトを使用する。
使用するスクリプトはCentOSで自宅サーバー構築で公開されている、opensshのchrootユーザー作成を参考にさせていただいた。
なお、現在のCentOS 6.5では標準でchroot環境が使えるため、手動でopensslパッケージをインストールする必要は無くなっている。
また、64bit版のCentOSを使うと、こちらで公開されている chroot-useradd スクリプトを若干変更する必要があったので、記述しておく。

#!/bin/bash
#
# Usage: ./chroot-useradd username [shell]
#

# 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

# Obtain username and HomeDir
CHROOT_USERNAME=$1
if [ "$2" = "" ] ; then
    useradd $CHROOT_USERNAME
else
    useradd -s $2 $CHROOT_USERNAME
fi
chown root:root /home/$CHROOT_USERNAME
chmod 755 /home/$CHROOT_USERNAME
usermod -d /home/$CHROOT_USERNAME/./ $CHROOT_USERNAME
passwd $CHROOT_USERNAME
rm -f /home/$CHROOT_USERNAME/.* > /dev/null 2>&1
cd /home/$CHROOT_USERNAME/./

# Create Directories no one will do it for you
mkdir -p etc
mkdir -p bin
mkdir -p usr/bin
mkdir -p usr/local/bin
mkdir -p usr/libexec/openssh
MAKEDEV -d dev -x null zero

# Create short version to /usr/bin/groups
# On some system it requires /bin/sh, which is generally unnessesary in a  chroot cage
echo "#!/bin/bash" > usr/bin/groups
echo "id -Gn" >> usr/bin/groups
chmod 755 usr/bin/groups

# Add some users to ./etc/paswd
grep /etc/passwd -e "^root" -e "^$CHROOT_USERNAME" > etc/passwd
grep /etc/group -e "^root" -e "^$CHROOT_USERNAME" > etc/group

# 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

# ※ 以下64bit版の変更箇所
# From some strange reason these 4 libraries are not in the ldd output, but  without them
# some stuff will not work, like usr/bin/groups
cp /lib64/libnss_compat.so.2 lib64/
cp /lib64/libnsl.so.1 lib64/
cp /lib64/libnss_files.so.2 lib64/
# ※ 以下の行注意!!
cp /lib64/ld-linux-x86-64.so.2 lib64/
cp /lib64/libc.so.6 lib64/
cp /lib64/libm.so.6 lib64/
cp /lib64/libpthread.so.0 lib64/
cp /lib64/librt.so.1 lib64/
cp /lib64/libthread_db.so.1 lib64/

exit 0
sshd の設定ファイルを変更に際して制限するグループを作成して、sshd_config にChroot 環境になるように、パスワード認証が使えるように書き足す。
vi /etc/ssh/sshd_config
Match Group chrootonly
    ChrootDirectory /home/%u/./
    PasswordAuthentication yes
service sshd restart
ユーザー作成例:
/root/bin/chroot-useradd testuser
passwd testuser
groupadd chrootupser
chmod -G chrootuser testuser
testuser でログインして chroot 環境が正確に実行できるか確認する。
ssh testuser@localhost
PhotoSync用にuploadディレクトリを作成する

chrootしたユーザーはホームディレクトリにディレクトリ作成権限が無いため。

mkdir /home/testuser/upload
chown -R testuser:testuser /home/testuser/upload

PhotoSyncの設定

  • 転送先の選択(Transfer Targets)
  • Configure
    IMG_0476
  • Target
    IMG_0477
  • FTP
    Add new configurationを選択
    IMG_0478
  • FTP/SFTP Settings
    先ほど作成したユーザーを設定する。
    FTP_SETTINGS

以上でざっくりとPhotoSyncの初期設定まで完了したはずである。

PhotoSyncアプリはこちら