AWSのITコストを削減 Simpline

選ばれ続けること

 

エンジニアブログ

ホーム - エンジニアブログ - 2014年8月

upstart-job

2014.08.20

検証目的でproxyサーバでも構築するかと、何となく久々にUbuntuで構築を進めていたところ、起動スクリプトに新しい仕組みが。。。
# ls -la /etc/init.d/squid3
lrwxrwxrwx 1 root root 21 1月 31 2013 /etc/init.d/squid3 -> /lib/init/upstart-job

どうやら起動時間短縮の為にUbuntuやFedoraに採用されているSysVinitに代わる仕組みらしい。設定ファイルは"/etc/init"配下に配置されている。
# cat /etc/init/squid3.conf
# squid - SQUID HTTP proxy-cache
#

description "HTTP proxy-cache"
author "Chuck Short <zulcss@ubuntu.com>"

# The second "or" condition is to start squid in case it failed to start
# because no real interface was there.
start on runlevel [2345]
stop on runlevel [!2345]

respawn
normal exit 0

env CONFIG="/etc/squid3/squid.conf"
env SQUID_ARGS="-YC"

pre-start script
if [ -f /etc/default/squid3 ]; then
. /etc/default/squid3
fi

find_cache_dir () {
w=" " # space tab
res=`sed -ne '
s/^'$1'['"$w"']\+[^'"$w"']\+['"$w"']\+\([^'"$w"']\+\).*$/\1/p;
t end;
d;
:end q' < $CONFIG`
[ -n "$res" ] || res=$2
echo "$res"
}

find_cache_type () {
w=" " # space tab
res=`sed -ne '
s/^'$1'['"$w"']\+\([^'"$w"']\+\).*$/\1/p;
t end;
d;
:end q' < $CONFIG`
[ -n "$res" ] || res=$2
echo "$res"
}

cache_dir=`find_cache_dir cache_dir`
cache_type=`find_cache_type cache_dir`

if [ "$cache_type" = "coss" -a -d "$cache_dir" -a ! -f "$cache_dir/stripe" ] ||
[ "$cache_type" != "coss" -a -d "$cache_dir" -a ! -d "$cache_dir/00" ]
then
/usr/sbin/squid3 $SQUID_ARGS -z -f $CONFIG
fi
end script

script
if [ -f /etc/default/squid3 ]; then
. /etc/default/squid3
fi

umask 027
ulimit -n 65535
exec /usr/sbin/squid3 -N $SQUID_ARGS -f $CONFIG
end script

下記の記載が、runlevel単位での起動/停止を制御している部分で、case文でstart/stop/status...の分岐も不要になったようなので読みやすくなったかもしれないけど、問題発生時に追跡し辛いのでは?と感じてしまう。
start on runlevel [2345]
stop on runlevel [!2345]

ちなみに"/etc/init.d"配下のコマンドを直接実行したら怒られた。
# /etc/init.d/squid3 status
Rather than invoking init scripts through /etc/init.d, use the service(8)
utility, e.g. service squid3 status

Since the script you are attempting to invoke has been converted to an
Upstart job, you may also use the status(8) utility, e.g. status squid3
squid3 start/running, process 12491

serviceコマンドを読んでみると、upstartジョブで管理されているスクリプトか否かを判断して実行しているようで、これだと怒られなかった。
# service squid3 status
squid3 start/running, process 12491

upstartジョブで管理されているサービスは、initctlコマンドで制御されているとのこと。
# ls -l /sbin/* | grep initctl
-rwxr-xr-x 1 root root 155512 1月 19 2013 /sbin/initctl
lrwxrwxrwx 1 root root 7 1月 19 2013 /sbin/reload -> initctl
lrwxrwxrwx 1 root root 7 1月 19 2013 /sbin/restart -> initctl
lrwxrwxrwx 1 root root 7 1月 19 2013 /sbin/start -> initctl
lrwxrwxrwx 1 root root 7 1月 19 2013 /sbin/status -> initctl
lrwxrwxrwx 1 root root 7 1月 19 2013 /sbin/stop -> initctl

ということで、下記の4種類のコマンドは全て同値の処理ということらしい。
# status squid3
squid3 start/running, process 12491
# initctl status squid3
squid3 start/running, process 12491
# service squid3 status
squid3 start/running, process 12491
# /etc/init.d/squid3 status
Rather than invoking init scripts through /etc/init.d, use the service(8)
utility, e.g. service squid3 status

Since the script you are attempting to invoke has been converted to an
Upstart job, you may also use the status(8) utility, e.g. status squid3
squid3 start/running, process 12491

start/stop/status/restartなんてコマンドにパスが通ってしまうことに違和感を感じてしまうのは自分だけだろうか。serviceコマンドが出始めた時に不要なコマンドを作る人がいるものだなあ、と思ったのも束の間。update-rc.dコマンドのオプションを使うたびに調べる必要がなくなった、と歓迎するべきか。

この記事がまとまっていて素晴らしかったです。
Sysvinit

OpenSSH鍵認証まとめ

2014.08.11

opensshの鍵交換について意外にまとまっているページが無いのでまとめてみる。

鍵の種類






現在はほぼssh2かつrsaがデフォルト。



























種類 作成コマンド パス 説明
SSH1 RSA ssh-keygen -t rsa1 ~/.ssh/identity SSH v1のみ
SSH2 RSA ssh-keygen -t rsa
("-t"オプションなしはこれ)
~/.ssh/id_rsa 特許期限切れ後、SSH v2で利用可能に
SSH2 DSA ssh-keygen -t dsa ~/.ssh/id_dsa SSH v2のみ

公開鍵と秘密鍵






接続元ユーザの秘密鍵(SSH client)⇔接続先ユーザの公開鍵(SSH server)のペアで認証される。キーペアはどこで作成したものかは問われない(鍵の中に作成したホスト、ユーザの情報は持っていない)。ファイルは暗号化されたテキストファイルの為、コピー&ペーストで操作しても問題はないが、適切なパーミッション(秘密鍵は600、公開鍵は644で良さそう)が設定されていないと正しく動作しない。Linuxなら/var/log/secureあたりを確認してエラーが出ていないか確認する。











接続元ユーザの秘密鍵(デフォルト) 接続先ユーザの公開鍵
~/.ssh/identity
~/.ssh/id_rsa
~/.ssh/id_dsa
~/.ssh/authorized_keys(※)

※OpenSSHのバージョンが古いものは、SSH2のみ"authorized_keys2"としていたが現在は統一されている

※公開鍵に複数指定が必要な場合は改行して追記することが可能

鍵変換






SSH関連ソフトウェアの鍵生成ツールにはOpenSSH変換機能がある。PuttyGenなら、"Conversions→Import  key/Export OpenSSH key"等の操作でssh-keygenで作成した秘密鍵⇔OpenSSH鍵を相互に変換することができる。不要に鍵ファイルを増やすことが無いよう注意。

設定ファイル(SSH server)






OpenSSH serverの設定ファイルは/etc/ssh/sshd_config。デフォルトで鍵認証は許されているはずなので、よりセキュアな設定とする為にはパスワード認証は許可しない等の設定を追加する。もちろんパスワード認証拒否は公開鍵認証での接続が確認できてから。



























/etc/ssh/sshd_config設定 説明
PasswordAuthentication パスワード認証の許可
ChallengeResponseAuthentication インタラクティブなパスワード認証の許可
RSAAuthentication RSA鍵認証の許可(SSH1のみ)
PubkeyAuthentication 公開鍵認証の許可
AuthorizedKeyFile 公開鍵のパス

設定ファイル(SSH client)






OpenSSH clientのデフォルト設定は/etc/ssh/ssh_config。オプション指定なしの場合にデフォルトで利用される秘密鍵等もここで定義されているが、ユーザ単位で操作する場合には、同一書式で、~/.ssh/configに記載しておくことで細かいオプションをHost指定で設定できる。詳細はssh_configのmanを参照。
# 設定サンプル
Host cent70
    Hostname 192.168.x.x
    PubkeyAuthentication no
    User root

Host 86sol11
Hostname 192.168.x.x
IdentityFile ~/.ssh/id_rsa
Port 22222
User XXXX

sshコマンドオプション






覚えておくべきsshコマンドのオプションはこのくらい。































ssh [オプション] 接続先ホスト [リモート実行コマンド] 説明
-l 接続先ユーザ指定(デフォルトは実行ユーザと同じ、接続先ホスト名の前に@指定も可能)
-i 秘密鍵ファイル指定
-p ポート番号がデフォルトの22以外を使用している場合に指定
-X X11フォワードしたい場合に指定(Oracle導入等、Xを使いたい時に覚えておくと便利)
接続先ホスト config指定のHost、名前解決できる名前、IPアドレス等を指定できる
リモート実行コマンド ホスト名指定に続けて実行するコマンドを指定することができる

known_hosts






初めてsshサーバに接続した際に、接続元ユーザの~/.ssh/known_hostsにサーバのホスト公開鍵が保存される(追記型)。サーバのホスト鍵は前項の"接続先ホスト"に指定した名前単位(config指定のHost、名前解決できる名前、IPアドレス)で管理され、同一の名前で接続した先のホスト鍵が異なると、接続に失敗するので、known_hostsから該当行を削除(またはコマンドにより削除可能)する必要がある。
# はじめての接続
$ ssh aaaaa
Are you sure you want to continue connecting (yes/no)?

# 同じ名前で異なるホスト公開鍵だった場合
$ ssh aaaaa
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

# known_hostsから接続先ホストの公開鍵を削除
$ ssh-keygen -R aaaaa
/root/.ssh/known_hosts updated.
Original contents retained as /root/.ssh/known_hosts.old