読者です 読者をやめる 読者になる 読者になる

labunix's blog

labunixのラボUnix

さくらVPSのDebian Wheezyのopenssh-serverをchroot-jessieに変更する

■さくらVPSのDebian Wheezyにchroot jessieを導入
 方法は以下と同様。プロキシが無い分楽です。

 Squeeze上のsid chrootにjessieのchroot環境を構築、Squeezeへ移動
 http://d.hatena.ne.jp/labunix/20130507

■wheezy の次の Debian のメジャーリリースのコードネームは、「jessie」です。

 Debian「jessie」リリース情報
 http://www.debian.org/releases/testing/

■早速導入

# apt-get install -y debootstrap schroot; \
  DEBRELEASE=jessie; \
  mkdir -p /var/local/${DEBRELEASE}
  env LANG=C debootstrap ${DEBRELEASE} \
    /var/local/${DEBRELEASE}  http://ftp.debian.or.jp/debian

■初期設定

# USER=labunix; \
  DEBRELEASE=jessie; \
  chroot /var/local/${DEBRELEASE} apt-get update; \
  chroot /var/local/${DEBRELEASE} apt-get upgrade; \
  chroot /var/local/${DEBRELEASE} apt-get purge -y isc-dhcp* nano; \
  chroot /var/local/${DEBRELEASE} apt-get install -y vim locales sudo less lv; \
  chroot /var/local/${DEBRELEASE} adduser ${USER}; \
  chroot /var/local/${DEBRELEASE} dpkg-reconfigure locales
...
  ja_JP.UTF-8... done
Generation complete.

■マウント

# DEBRELEASE=jessie; \
  echo "[jessie]
description=jessie
directory=/var/local/${DEBRELEASE}
users=${USER}
" >> /etc/schroot/schroot.conf; \

# tail -5 /etc/fstab
none    /var/local/jessie/dev/pts       devpts  gid=5,mode=620  0       3
none    /var/local/jessie/dev/shm       tmpfs   defaults        0       3
none    /var/local/jessie/proc          proc    defaults        0       3
none    /var/local/jessie/sys           sysfs   defaults        0       3

# mount -a

■ログインチェック

# DEBRELEASE=jessie; \
  echo "chroot-jessie" > /var/local/${DEBRELEASE}/etc/debian_chroot; \
  exit
$ DEBRELEASE=jessie; \
  schroot -c ${DEBRELEASE} -p
(chroot-jessie)labunix@XXXXX:~$ exit

■chroot-jessieにSSHサーバの導入
 仮想マシンのWheezyと、chroot環境のjessieとポートが被らないように設定

# DEBRELEASE=jessie; \
  chroot /var/local/${DEBRELEASE} apt-get install -y openssh-server; \
  echo '#!/bin/bash
export TZ=Asia/Tokyo
/etc/init.d/ssh restart' > /var/local/${DEBRELEASE}/etc/rc.chroot-ssh; \
  chmod +x  /var/local/${DEBRELEASE}/etc/rc.chroot-ssh; \
  sed -i s/"exit 0"// /etc/rc.local; \
  echo '
DEBRELEASE=jessie
CHROOT_HOME=/var/local/${DEBRELEASE}
if [ -x ${CHROOT_HOME}/etc/rc.chroot-ssh ]; then
/usr/sbin/chroot ${CHROOT_HOME} /etc/rc.chroot-ssh restart
fi
exit 0
' >> /etc/rc.local

■chroot-jessieのユーザssh鍵を作成
 ※例ではRSA鍵。

$ DEBRELEASE=jessie; \
  schroot -c ${DEBRELEASE} -p
(chroot-jessie)labunix@XXXXX:~$ ssh-keygen -t rsa

■sshサーバの再起動

# DEBRELEASE=jessie; \
  grep -B 1 ^Listen /var/local/${DEBRELEASE}/etc/ssh/sshd_config 
AddressFamily inet
ListenAddress 0.0.0.0

# /etc/rc.local | tail -1
[ ok ] Restarting OpenBSD Secure Shell server: sshd.

■iptablesの設定
 例えば22/tcpを追加するには。

# SSHPORT=22;IPTABLES=/sbin/iptables; \
  $IPTABLES -A INPUT -p tcp -m tcp --dport $SSHPORT -j ACCEPT

■デフォルトのsshのログイン先はchroot側に変更
 sshポートを変更するだけ。
 同じユーザでも認証が別なので、ログインパスワードも別々に設定出来る。
 当然ssh鍵も署名も別々。
 上記で追加したiptablesルールは再起動後にはなくなるので、
 chroot-jessieにログインしてから仮想マシンのwheezyにsshログインすることになる。

■バックアップスクリプトの変更
 仮想マシンの待受IPをローカルのみにしたので、
 chroot-jessie経由で無いとsshログイン出来ない。
 「mount --bind」でバックアップ中のみ対象のディレクトリを
 chroot-jessieからrsyncでアクセス出来るようにするスクリプトを追加した。

$ grep ^ListenAddress /etc/ssh/sshd_config 
ListenAddress 127.0.0.1

# DEBRELEASE=jessie; \
  chroot /var/local/${DEBRELEASE} apt-get install -y rsync

■cryptsetupのマウントを自動化する。

# vim /root/cryptkey; \
  chmod 0400 /root/cryptkey; \
  cryptsetup luksAddKey /home/luks.img /root/cryptkey; \
  cryptsetup luksDump /home/luks.img  | grep "Slot.*ENABLED"
Key Slot 0: ENABLED
Key Slot 1: ENABLED

■initスクリプトにする。
 ※「.bash_logout」「.bashrc」の呼び出しスクリプトを削除
  PAM連携とか色々あるようだけど、せっかく作ったスクリプトを流用する。

# cp /home/labunix/myscripts/cryptmount.sh /etc/init.d/ ; \
  chown root:root /etc/init.d/cryptmount.sh; \
  chmod 0755 /etc/init.d/cryptmount.sh; \
  chkconfig cryptmount.sh on; \
  chkconfig --list cryptmount.sh
cryptmount.sh             0:off  1:off  2:on   3:off  4:off  5:off  6:off

# /etc/init.d/cryptmount.sh status
/dev/mapper/luks is active and is in use.
  type:    LUKS1
  cipher:  aes-cbc-essiv:sha256
  keysize: 256 bits
  device:  /dev/loop0
  loop:    /home/luks.img
  offset:  4096 sectors
  size:    2043904 sectors
  mode:    read/write

# /etc/init.d/cryptmount.sh stop
# /etc/init.d/cryptmount.sh status
/dev/mapper/luks is inactive.
# /etc/init.d/cryptmount.sh start
/dev/mapper/luks on /home/labunix/mydata type ext2 (rw,relatime,errors=continue,user_xattr,acl)

■再起動して確認、自動マウント出来た。
 自動マウントだけど、chroot側では仮想マシンのrootで
 「bind mount」しないとアクセス出来ないので良しとする。

$ mount | grep luks
/dev/mapper/luks on /home/labunix/mydata type ext2 (rw,relatime,errors=continue,user_xattr,acl)
# su root -c '/etc/init.d/cryptmount.sh status'
パスワード:
/dev/mapper/luks is active and is in use.
  type:    LUKS1
  cipher:  aes-cbc-essiv:sha256
  keysize: 256 bits
  device:  /dev/loop0
  loop:    /home/luks.img
  offset:  4096 sectors
  size:    2043904 sectors
  mode:    read/write

■起動時の「pcspkr」「bluetooth」のエラーの対処

# cat /etc/modprobe.d/blacklist.conf 

# See also dmesg. 20140830
# [    2.027784] input: PC Speaker as /devices/platform/pcspkr/input/input2
# [    2.472005] Error: Driver 'pcspkr' is already registered, aborting...
#
blacklist pcspkr

# See also dmesg. 20140830
# bluetoothd[2720]: Failed to init alert plugin
# bluetoothd[2720]: Failed to init time plugin
# bluetoothd[2720]: Failed to init gatt_example plugin
#
blacklist bnep
blacklist btusb
blacklist bluetooth

# for IPv6
blacklist ipv6

■blacklistの反映

# update-initramfs -u -k `uname -r` -v

■USBとvda3のリマウントのログが残った。

# dmesg | grep -B 2 -i "error\|warn\|crit\|fail"
[    2.694079] usb 1-1: Manufacturer: QEMU 0.12.1
[    2.694080] usb 1-1: SerialNumber: 42
[    2.701245] WARNING! power/level is deprecated; use power/control instead
--
[    3.100550] Adding 13671420k swap on /dev/vda2.  Priority:-1 extents:1 across:13671420k 
[    3.115791] EXT4-fs (vda3): re-mounted. Opts: (null)
[    3.216188] EXT4-fs (vda3): re-mounted. Opts: errors=remount-ro

■QEMUのUSBドライバの問題のようなのでスルー。

# lsusb -t
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=uhci_hcd/2p, 12M
    |__ Port 1: Dev 2, If 0, Class=HID, Driver=usbhid, 12M

■以下はext4ではよくあるエラーの様子。
 オプションどおりの動作でパーティション自体に問題も見られないのでスルー。

# ls -l /dev/disk/by-uuid/ | grep vda3 | \
  awk '{print $(NF-2)}' | grep `xargs` /etc/fstab | awk '{print $2,$3,$4}'
/ ext4 errors=remount-ro

■およそ半分ですか。

# ps axo pid,cmd,%cpu,%mem | awk '($NF>1)||($(NF-1)>0.0){print}'
 2882 /usr/sbin/spamd --create-pr  0.2  3.0
 2883 /usr/sbin/amavisd-new (mast  0.1  4.7
 2905 spamd child                  0.0  2.9
 2906 spamd child                  0.0  2.9
 2907 /usr/sbin/amavisd-new (virg  0.0  4.7
 2908 /usr/sbin/snort -m 027 -D -  0.1  5.5
 2910 /usr/sbin/amavisd-new (virg  0.0  4.7
 2929 /usr/sbin/clamd -c /etc/cla  0.0 13.4
 3094 /usr/bin/freshclam -d --qui  0.3  0.1
 3360 /usr/bin/python /usr/bin/fa  0.1  0.4

# df | awk '{sum+=$3};END{print sum/1024/1024"GB"}'
13.1353GB

# top -b -n 1 | head -5
top - 02:42:08 up 15 min,  1 user,  load average: 0.00, 0.06, 0.11
Tasks:  97 total,   1 running,  96 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.8 us,  0.2 sy,  0.0 ni, 98.5 id,  0.4 wa,  0.0 hi,  0.0 si,  0.1 st
KiB Mem:   2061060 total,   891408 used,  1169652 free,    19320 buffers
KiB Swap: 13671420 total,        0 used, 13671420 free,   241360 cached

■そろそろ、メモリクリアの手段があった方が良さそう。

# ./myscripts/autoclear.sh 
# Usage ./myscripts/autoclear.sh [-t|test]
# Default:
#   SWAPUSED>0 && MEMUSED<70; -> clear cache and reset swap.
# -t|test
# force clear, cache and reset swap

2014/08/30,02:55:40,MEMUSED=32%,SWAPUSED=0%