askpassのことを書いておく
askpassとは何なのか
askpass とはその名の通り、プログラムからパスワードが必要になったときに呼ばれるプログラムのこと。
よくある使われ方としては、GTKのプログラムで特権が必要になった際に、sudo
のパスワードを尋ねるためのウィンドウを出すみたいなやつ。
なので、 ssh-askpass
のようなワードで調べると、X11とかその辺が引っかかるが、そもそも askpass
が何をするものなのかよくわからなかったので、書くことにした。
askpass を思い出したきっかけ
今の仕事で特権取得を自動化できないかというのが考え始めたきっかけで、RubyのCapistranoのことを考えていた。
ちょっと前までWeb屋をやっていたころはRubyで書かれたコードをデプロイすることも多く、capistranoを使ってデプロイをしていたのですが、 その際にたまたま見かけたのが以下のエラーメッセージ。
sudo: no tty present and no askpass program specified
これは sudo
が出すエラーメッセージで、tty
がないし askpass
もないよというものである。
当時は今より弱かったので、なんのこっちゃという感じで意味もよくわからずなんとなく直していたのですが、 ふと考えてみると、capistranoで特権がいる場合に何度もパスワードを入れた覚えがないな、ということはここは自動化してるのかと気づきました。
ところで、似たようなものは Ansible を使っているときにも見かけることがあって、-K
オプションみたいなやつですね。
もちろんどちらもSSHを自動化するものなので当たり前なんですが。
askpass がやること
askpass program とか書かれると、何やら大層なプログラムなのではないかと身構えていて、なんだか大変そうと思っていたのですが、 askpassとは要はパスワードを標準出力に書き出すプログラムのことなのである。 パスワードを書き出すまでにいろいろとやるものもあるが、必要なのはパスワードを標準出力に出すところだけ。 以下のようなシェルスクリプトでも構わないそうな。。。
#!/bin/bash echo "secure_password!!!!"
askpass プログラムの指定
askpass の指定は環境変数を使う。例えばSSHのパスワード入力を自動化したければ、上記のスクリプトを /tmp/askpass
という名前で置いて、 chmod +x
しておいて
export SSH_ASKPASS=/tmp/askpass
としておく。SSHでパスワードが必要になった場合、代わりにこのスクリプトが出力する secure_password!!!!
が使われて大変便利。
capistranoはこれと同じようなことを、sudoでも使っていて、内部的には sudo -A #{command}
とでもしているんだろうとは思う。
何はともあれ
askpassを使うとパスワードの入力を自動化できるので使いこなせば非常に便利。
ただ、調べ方がうまくないとその存在に気付きづらい。こういうのみんなどうやって調べているんだろ。
すごいどうでもいいんですが、転職したばっかりなのに割と飽きてるので、現状引き抜きOKなエンジニアです。
そこそこ使えるストレージサーバを作るときに考えていたこと(概念)
前置き
私がWebサービスの会社でサーバ構築・運用の仕事をやっていた頃の話です。
ストレージサーバはユーザさんのコンテンツを保存する重要なサーバでしたが、 コンテンツの増加に伴い、既存のサーバでは十分な性能を出せていなかったことがありました。
運用面でのコスト増加、スケールアウトを行う上での問題などいくつかの条件が重なった時期を見て、 コスト計算、技術的な問題点などを洗い出し、サーバを新規に作り直す提案をしたところ、会社として了承が得られ、 ちょっとしたリプレイスを行うことになりました。
その際、運用コストが増加している原因をあわせて取り除きつつ、安定するサーバ構成を取れればよいと思い、 ストレージサーバの性能向上と、データ冗長化を強化できる構成としました。
目標は、低コストで読み込み性能がそれなりにあり、メンテナンス性がよく耐障害性のあるサーバですが、 確保した予算を超えない範囲で性能、安定性の向上を果たす必要があります。
この件では考える機会が多く、日頃知っている知識を広く使った総合的なお仕事でしたので、 自分でも後から見直したときに便利そうということでまとめておきます。
(余談ですが職場にはこのページには書いていない具体的な戦略などをまとめた文書を置いてあり、 また特定の環境のことについては触れていないため、同僚の方は読まなくても差し支えないと思います。)
続きを読むC92夏コミに来てくださった皆様、ありがとうございました!
C92お疲れ様でした。ようやく落ち着いたのでちょこっとアフター記事を書きます。
今年の夏コミは曇りということもあって比較的涼しく過ごしやすい天候でしたね。
た13bは東7ホールの端っこです。よろしくお願いしますー pic.twitter.com/yHswKSOIf2
— シリルういろう@金曜日東た13b (@d_cyrill1129) 2017年8月10日
東7ホールめっちゃ涼しい😇
— シリルういろう@金曜日東た13b (@d_cyrill1129) 2017年8月11日
今回は東7ホール配置でした。東7ホールは空調がちゃんと効く素晴らしいホールなので端に配置された!とか思ってはいけません。
C92参加のお知らせを直前まで出せずほぼ告知なしの状態でしたが、足を運んでいただいた皆様には感謝です。
今回は既刊のひだまりPHP vol3と新刊のAnsible本を持っていきましたが、 手で持っていけるくらいの少ない搬入数でしたので、お昼過ぎにすべて完売しました。
結構疲れが来てるので今日は撤収します!ありがとうございましたー!
— シリルういろう@金曜日東た13b (@d_cyrill1129) 2017年8月11日
13時前には抜けてしまったので遅めに来てくださった方には頒布できず申しわけなかったです。
次回のC93はサークル参加は見送りの予定です。
またどこかでお会いできる機会があればぜひお越しください。
夏コミ打ち上げっぽい写真です pic.twitter.com/SADJPmrATZ
— シリルういろう@金曜日東た13b (@d_cyrill1129) 2017年8月15日
HTTPでバックアップファイルを軽く配る
最近はバックアップファイルを配る時にHTTPを使っている。
クライアント側では curl
を使って手軽に引っ張ってこれてそのまま tar
に流して簡単に展開できて便利。
あとは scp
だとCPUが貧弱なマシンだとやや使いづらい。
クライアント側からのアップロードをするには WebDAV を使う必要があって少し手間だけどその程度で一回用意すれば使い勝手はそこそこよい。
あとは Subversion と組み合わせるのとかも便利かな。いや、これはどっちでもいいか。
curl
curlでhttpリクエスト飛ばすだけでいいけど、バックアップサーバはHDDのようなストレージを乗せていて、 バックアップを取ってる時に復元しようとするとIO的にしんどいタイミングがある。
そういうタイミングは --limit-rate
をつけてちょっとだけ優しくするとよい。
curl --limit-rate 100M http://backup.local/data.tar.gz | tar xzv
100M
は何となく。シーケンシャルで取るならHDDでも100Mくらいは軽く出るけど、出ないときもあるのでその時はもっと優しくする。
あとは、 ionice
しておくとか。ただサーバ側でつけるのは面倒だしクライアント側だけで完結する --limit-rate
程度が手間がなくていいかな。人力なのがちょっとだけ温かみがある。
rsync と scp
暗号化されてCPUが貧弱だと辛い時があるけど、一般にはよく使われる。
rsync
はパスの指定で最後に /
を付けるようにしているけどたまに忘れると面倒なことになる。
まあこれはどうでもいい。
あと、暗号化方式を軽くする時に -e "ssh -c arcfour"
を入れるというテクニックもあったけど、
openssl
のバージョンアップに伴って RC4
は使えなくなりつつある。
まとめ
HTTPサーバは apache
とか nginx
あたりを適当に使えばいいので作るのは簡単。
Web屋さんなら軽く用意できるかな、って感じです。
ガルパやりたい
— シリル@バンドリフレンズ (@d_cyrill1129) May 6, 2017
PXEBOOT/BOOTP/DHCPあたりのことをまとめておく
この辺りはよく使ってる技術なんだけど一回作ってしまうと細かなことは忘れてしまうし、 AWSのようなクラウドサービスを使っていると触れる機会も減ってしまうので、 覚えているうちにまとめておこうと思う。
PXEBOOT
ネットワークカードに搭載されているPXE(Preboot eXecution Environment)機能を使ってプログラムを起動する方法。
起動するプログラムはDHCPサーバとTFTPなどのサーバを組み合わせて配布する。
ネットワークカードにPXEBOOTのための機能が搭載されているものがあれば、BIOSのBOOTをネットワークブートに設定すれば使える。
DHCPはBOOTPの上位互換プロトコルなので、BOOTP的な設定はDHCPサーバの設定に書くこともできる。
DHCP設定にTFTPサーバがどのアドレスかなどの情報を書いておき、クライアントに配布できるが、特に指定がない場合DHCPサーバとTFTPサーバは同じアドレスとみなされる。
TFTP、DHCPサーバともに軽量なサーバなことが多く、同じ物理サーバに設置することもある。
DHCP
PXE対応ネットワークカードは起動時にDHCPでマルチキャストパケットを投げる。
ネットワーク上にDHCPサーバがあれば、パケットに応答しPXEの情報をクライアントに返す。
複数のDHCPサーバが応答する場合、どれが応答するかわからなくなるため同一ネットワークに複数のDHCPサーバと立てないようにしたい。
TFTP
UDPでやりとりするファイル転送用のプロトコル。FTPより単純で認証などない。PXEで実行するイメージを転送する際に使うことができる。
暗号化も特にされていないので ngrep などでパケットを眺めればどういうやり取りがされているか簡単にわかる。
MACアドレスやDHCPで割り当てされたIPアドレスの一部を使って設定ファイルをダウンロードしようとする。これはPXEの仕様。
例えば、 192.168.0.200
をDHCPで割り当てた場合、それぞれのアドレスを16進数に変換した、 C0A800C8
というファイルをリクエストする。
ファイルが見つからなかった場合、1文字短くした C0A800
、 次には2文字短くした C0A8
といったファイルを順にリクエストしてくる。
この仕組みがあるので、サブネットごとに違うアドレスレンジをDHCPサーバが返すことでネットワークごとに違う設定ファイルをクライアントに渡すことができる。
設定ファイルの実体は pxelinux.cfg
と同じ書式のもので、シンボリックリンクで名前だけ用意するのが簡単。
TFTPサーバはセキュリティの都合上、chroot化で実行されることがままあるため、シンボリックリンクを張る際には /
からの絶対パスではなく相対パスで作成しておくのが無難。
DebianでPXEサーバとDHCPサーバとTFTPサーバを作る例
TFTPサーバは tftpd-hpa
、DHCPサーバは isc-dhcp-server
をそれぞれ使う。
apt install tftpd-hpa isc-dhcp-server
TFTPサーバの設定
TFTPサーバの設定は /etc/default/tftp-hpa
だが、対して設定項目もないのでそのまま使ってもよい。
その場合、 /srv/tftp
がTFTPサーバのルートとなり、chrootされた状態でサーバが起動される。
TFTP自体の設定は対してないが、いくつか重要なファイルがある。
/srv/tftp/pxelinux.0
pxelinuxのブートイメージ。後述のDHCPサーバの指定で細かな指定がない場合 filename "pxelinux.0"
はこのパスになる。
/srv/tftp/pxelinux.cfg/
MACアドレスやIPアドレスで設定ファイルを探しに来る場所。該当するMACアドレスやIPアドレスのものがない場合は default
のファイルが読みだされる。
いずれのファイルも見つからない場合、ネットワークブートは失敗に終わる。
DHCPサーバの設定
DHCPサーバの設定は、 /etc/dhcp/dhcpd.conf
でこちらはネットワークに合わせて少し設定が必要になる。
この辺りは単にDHCPの設定になるし、DHCPは家庭LANでもよく使われているので改めて説明の必要もないかもしれない。
allow bootp
と allow booting
あと、 nameserver
の設定、PXEのイメージを配るときの名前 filename
あたりの設定と、ネットワークのサブネット周りをちゃんと見ておく。
DebianのWikiにも設定例があるけど、細かいところはネットワークによって違うので何とも言い難い。
サーバの再起動
設定ができたら、DHCPとTFTPを再起動しておく。最近はsystemdでやる。
動作確認
多分これだけで動く。適当に動作確認して問題なければこのまま使えばいいと思う。終わり。
コミティアいくぞ
— シリル@バンドリフレンズ (@d_cyrill1129) 2017年5月5日
老エンジニアだけど dotfiles を更新したい、だけど慣れた設定書き換えるのって怖くない?辛い...って思ってサボってきた更新をなんとかした話
概略
- 最小のSandbox環境を作る。
/home/$USER
をgit init
してコミット- どうせ Sandbox だし乱暴する
- dotfiles をいい感じに書き換えてセットアップ
- どうせ Sandbox だし乱暴する
- 期待通りの挙動をしない場合、gitの機能で元に戻し、うまくいったらコミット
git clean -df
でだいたいうまくいく
以下詳細をまとめます。
debootstrap + chroot なサンドボックス環境を用意する
前はvagrantで律儀にsnapshotをとって戻して差分を確認していたが、もうちょっと雑にやる方法はないものかと chroot 環境を用意。
DebootstrapはDebianのWikiに細かい説明がある。
stable Debianの最小構成をインストールする
sudo apt-get install debootstrap chroot mkdir -p /tmp/workdir cd /tmp sudo debootstrap stable workdir/ sudo chown -R $USER. workdir
これで /tmp/workdir
にdebianがインストールされる。
chroot する
chroot
するには特権が必要なので少し心が傷むが自分のマシンだからまあいいかと割り切ってsudo chroot
をキメる。
sudo chroot workdir/ /bin/bash
cd /root
これで root シェルが取れる。
Debianの基本セットアップをする
最小構成のDebianでは色々とパッケージが足りなくて辛い気持ちになる。 apt update
すらできないからね。
あと、 proc
とか /dev/pts
とかもないね。まあこのあたりはどこまでそれっぽくするかによるし、いらないセットアップな気もする。
/tmp
が必要なら mkdir /tmp
とでもしておけばいいと思う。 (律儀にtmpfs
をmount
しなくてもいいよね)
echo "deb http://ftp.jp.debian.org/debian/ jessie main contrib non-free deb http://ftp.jp.debian.org/debian/ jessie-updates main contrib deb-src http://ftp.jp.debian.org/debian/ jessie main contrib non-free deb-src http://ftp.jp.debian.org/debian/ jessie-updates main contrib" > /etc/apt/sources.list apt update
apt update
したいので、sources.list
を雑に用意する。(apt-getじゃなくなって久しい)。
あとは適当に必要なパッケージ、zsh
とかtmux
とか好きに入れる。
このあとで使うので git
も入れておく。 git
って以外と依存パッケージが多いねって気持ちになるがまあこんなものかもしれない。
apt install zsh tmux curl git
apt
の幾つかで警告が出ることがあるが、心を痛めつつ無視して先に進める。(サンドボックスは乱暴する)
git管理を始める
ロックに $HOME
で git init
をキメて全ファイルをコミットする。
dotfiles
用のリポジトリが用意してあればそれをclone
しておきそれもコミットする。
cd $HOME git init git clone https://github.com/..../dotfiles git add . git commit -m 'Commit all home files'
これで $HOME
以下のファイルはすべて追跡できるようになった。
dotfilesに乱暴をする
大抵の変更は git commit
の時点まで戻せるので、乱暴に自分の dotfiles
を書き換えてchroot環境でセットアップする。
変更が気に入らなかった場合、 git clean
を使いすべての変更を捨てる。怖い場合は dry-run もある。
git clean -df # git clean -dfn (DRY RUN)
変更がうまくいったら、適当にコミットする。このあたりはコミット粒度とかプログラミングスタイルが試される。各自いい感じにしてほしい。
コミットは chroot 環境の外からキメるのが楽。
git commit
終わりに
基本なまけものなのでこういうのは気が向いたときにしかやらない。
終わったらSandboxなので適当に捨てるといいけど、丁寧に proc
とかを mount
していると rm -rf
したときに寒い感じがする。
技術書展2 に出ます
ところでまったく話は変わりますが、2017/4/9に行われる技術書オンリーイベント「技術書典2」に 「mochi mochi laboratory」さんと合同で参加します。 (TechBooster / 達人出版会 さん主催)
「mochi mochi laboratory」と「ゆきいろパラソル」の合同サークル 「もちもちパラソル」 です。
情報は ゆいしろさんの特設ページと、こっちでも少し情報を流していきます。
もちもちパラソル 技術書典2 特設ページ
技術書典2
進展がありましたら更新します。
最近のこと
シンデレラキャラバンのこずえさん、いつのまにかいなくなってて泣きそう
— シリル@技術書典2 う-01 (@d_cyrill1129) 2017年1月16日
デレステのシンデレラキャラバンの回収は期限付き。忘れないようにしないとこうなります。つらい。
マジかよー・・・ pic.twitter.com/5ycNyapB3u
— シリル@技術書典2 う-01 (@d_cyrill1129) 2017年1月9日
iPhoneのディスプレイ割れてる人は強制交換ペナルティ1万2000円がかかります。やったね。
冬コミ、やっぱりコミケ参加したい欲求が高いということがわかり、技術書典2に出ることにしました。夏も申し込むけど、結局同人ソフトで出ることになる…かな。漫画描けるようになりたい。