In the Spica (Satellite)

気になることを書いていた日記のレスキュー版です

Track.20 ときめくような一杯を

この記事について

この記事はごちうさ Advent Calendar 2015の20日目の記事です.

昨日は,きゅぶんずさんの担当でした.

明日は,kivantiumさんの担当です.

あと,この記事は後日私のサーバが復活した際に移動します.

はじめに

私は,岡部倫太郎氏が通っていたキャンパスを売っぱらいながらも,公式ページでトップニュースとしてシュタインズゲート新作を祝う大学に所属している. 学科は,一応公式ページ等では情報通信工学科と表記されているが,正弦波を含む本文をひたすら手書きし続ける社畜養成学科である.

ひとまず愚痴はさておき,このような修練を徹夜で積んでいると精神状態が著しくおかしくなってしまう. この時に自分を救ってくれたのがkoi氏による「ご注文はうさぎですか?」という作品である.

ごちうさについて

ご注文はうさぎですか?」は,全てにおいて素晴らしい作品である. その物語全てに登場する,キャラクターやストーリーを「可愛い」の一言で体現される世界に凝縮し,また音楽や街並みを「美しい」世界に凝縮した作品である. 特に,テレビアニメ「ご注文はうさぎですか?」で描かれる舞台は,フランスの街並みを再現するため取材を行い*1描くなど,細部に渡って非常に手の込んだ作品となっている.

仮説

以下に示す画像はGoogleトレンドにおける「ご注文はうさぎですか?」「てさぐれ!部活もの」「きんいろモザイク」の比較である. f:id:nmkn:20151221144244p:plain

この画像は,尊いと表現されるアニメ同士*2のトレンドの比較である. 「ご注文はうさぎですか?」はいずれにおいても,トレンドすなわち話題になっていると言える. ここで,ご注文はうさぎですか?」は情報系の学生にとって重要な存在では無いかという仮説を立てる.

突然の結論

ところで,情報系にとって重要な存在といえば,エディタが挙げられる. 以下は,「vim」と「emacs」と「ご注文はうさぎですか?」の比較である. f:id:nmkn:20151221145932p:plain あー,vimには勝てなかったか……

エディタには勝てなかったですが,emacsを抜けそうなので今後も「ご注文はうさぎですか?」を応援していきたいと思います.

反省

記事を書くのが間に合わなくて,適当になってしまいましたごめんなさい.

*1:Koi, まんがタイムきらら: 「ご注文はうさぎですか? TVアニメ公式ガイドブック Memorial Blend」 芳文社, pp.113, 2014

*2:てさぐれは尊いのかわからないが

SECCON 2015 Web予選 Writeup

この記事はNomuken氏の温かい手作業で一つ一つ復元されていった記事の一つです.

ポエム

よくよく考えてみると人生二回目のSECCONでした. ふと,Teamの回答状況を眺めながらあぁ去年も似たような回答状況だったなぁと,と反省しています. とはいえ,出来ることも増えてきたりしているので,今後も精進という感じです.

今回もまた,iwasi先輩と自分の2人のCAFEBABEというチームで参加しました. CAFEBABEは,1600点で111位でした.二進数表現を感じる順位でした.

f:id:nmkn:20151216202147p:plain

完全に精進が足りない順位なので反省.

自分が解いた問題は以下の通り

  1. Start SECCON CTF
  2. Unzip the file
  3. Connect the server
  4. Command-Line Quiz
  5. Entry form
  6. Exec dmesg
  7. Decrypt it

(iwasi先輩が解いた問題のwriteupはこちらから)

WriteUp

Start SECCON CTF

ex1
Cipher:PXFR}QIVTMSZCNDKUWAGJB{LHYEO
Plain: ABCDEFGHIJKLMNOPQRSTUVWXYZ{}

ex2
Cipher:EV}ZZD{DWZRA}FFDNFGQO
Plain: {HELLOWORLDSECCONCTF}

quiz
Cipher:A}FFDNEVPFSGV}KZPN}GO
Plain: ?????????????????????

There is no bonus in this question

やるだけ,問題文のex1にA-Z{}の対応表が存在するのでそれと照らし合わせていくだけ.

SECCON{HACKTHEPLANET}

Unzip the file

Unzip the file
unzip

やるだけ,古来より伝わるpkcrackに突っ込んで終了.

f:id:nmkn:20151216202002p:plain

既知の平文を探す際に少々手間取ったが「seccon backnumber」と考えれば,登録したはずなのに突然届かなくなることで有名なメールマガジンのログファイルだと推測できました.

最終的に出てくるflagというファイルですが,MSなWordファイルでした. 開いてみると,白文字でflagが書いてありました. 最後まで手の込んだ仕様で感動しました.

メールマガジンのファイルは2015年の分も含め,2014年のメールマガジンのページからダウンロードが出来ます. 僕は,再度メールマガジンの登録を行いました.

SECCON{1s_th1s_passw0rd_weak?}

Connect the server

login.pwn.seccon.jp:10000

ひとまず,ncで接続.単に平文で通信を行うことを考えれば別にtelnetでも問題はない. 以下は接続時の表示.

f:id:nmkn:20151216202027p:plain

どうやらダイアルアップを再現した接続されているサーバのようです.

ログインせずに長い間放置していると以下のような表示が出ました.

f:id:nmkn:20151216202100p:plain

It is already in your hands.とのことですので,どうやら既にフラグは手に入れているようです. となると,一見見えないところを見る必要があるのでパケットを見てみましょう.

一応,login.pwn.seccon.jpIPアドレスを調べておくとwiresharkで検索がしやすいのでおすすめです.

f:id:nmkn:20151216202133p:plain

単純にWireSharkでFilterにip.addr == 133.242.228.87をつっこんで,単純に平文で通信の内容を見るためにFollow TACP Streamをします.

以下はその結果.

f:id:nmkn:20151216202244p:plain

SECCON{Sometimes_what_you_see_is_NOT_what_you_get}

Command-Line Quiz

telnet caitsith.pwn.seccon.jp
User:root
Password:seccon
The goal is to find the flag word by "somehow" reading all *.txt files.

telnet caitsith.pwn.seccon.jp
User:root
Password:seccon
すべての *.txt ファイルを読め

caitsithと聞いて,熊猫さくら先生を思い浮かべたキャンパーも多かったのでは,と推測します.

ひとまずは,telnetで与えられた情報通りに接続します. 接続したスコアサーバはrootで接続しているにも関わらず,ファイルが読めない強制アクセス権が適用されたサーバに接続されます. おそらく,ホストマシン内にコンテナを用意して,そちらに接続してるんじゃないかなと思いました.

この問題の流れは,/に存在する問題ファイルを読み,次のステージに進むための回答を環境変数に代入しshを起動し進めていくというものである. 各ステージごとに解説を行っていきたい.

Stage1

$ cat stage1.txt 
What command do you use when you want to read only top lines of a text file?

Set your answer to environment variable named stage1 and execute a shell.

  $ stage1=$your_answer_here sh

If your answer is what I meant, you will be able to access stage2.txt file.

ファイルの文頭の内容を確認するのはheadですね.

$ stage1=head sh

Stage2

$ cat stage2.txt 
What command do you use when you want to read only bottom lines of a text file?

Set your answer to environment variable named stage2 and execute a shell.

  $ stage2=$your_answer_here sh

If your answer is what I meant, you will be able to access stage3.txt file.

ファイルの文末だけ出してくれるコマンドはtailですね.

$ stage2=tail sh

Stage3

$ cat stage3.txt 
What command do you use when you want to pick up lines that match specific patterns?

Set your answer to environment variable named stage3 and execute a shell.

  $ stage3=$your_answer_here sh

If your answer is what I meant, you will be able to access stage4.txt file.

特定パターンに適合する行を取り出すのはgrepですね.

これなんですが,最初解いていた時にgrepと回答したのに不正解扱いにされましたが,時間をおいてやりなおしたらちゃんと解けました. 途中が悪かったのか,もしくはpolicyに不備があって修正されたのか……. この時はIRC見てなかったのでよくわからないです.

$ stage3=grep sh

Stage4

$ cat stage4.txt      
What command do you use when you want to process a text file?

Set your answer to environment variable named stage4 and execute a shell.

  $ stage4=$your_answer_here sh

If your answer is what I meant, you will be able to access stage5.txt file.

テキストファイルを処理する……と言われてなんなんだという感じですが,答えはawkでした. 最初,処理も何もという感じだったのでcatかなと思ったのですが,awkでした.

$ stage4=awk sh

Stage5

$ cat stage5.txt 
OK. You reached the final stage. The flag word is in flags.txt file.

flags.txt can be read by only one specific program which is available
in this server. The program for reading flags.txt is one of commands
you can use for processing a text file. Please find it. Good luck. ;-)

最後のflag.txtを見るためにはテキストファイルを処理する何らかのコマンドを使わなくてはならないそうです. 今までの回答してきたのはもちろんダメでしたし,そもそもcatもダメでした.

となると,という感じでsedを使うことで中身を見ることが出来ました. sedは文字列を正規表現を利用して置換する超最強かつ強力なツールですが,今回は置換する必要が無いので単純に置換しないように正規表現を書いて中身を見てみましょう.

$ sed "s/(*)/\1/g" flags.txt 
OK. You have read all .txt files. The flag word is shown below.

SECCON{CaitSith@AQUA}

というわけで,フラグは以下の通り.

SECCON{CaitSith@AQUA}

Entry form

http://entryform.pwn.seccon.jp/register.cgi

( Do not use your real mail address.)
(登録情報に他人に知られたくないメールアドレスは使用しないでください)

個人的に,うーんって感じの問題でした.

競技後にアクセスしたところ接続を切られてしまうため,画像なしでお届けします.

単純に開くと,メールアドレスとユーザネームを書くとエントリーが完了するというシンプルな問題です. 当初ちゃんとメールが届くのかなと思いましたが,届かなかったです. 途中から(登録情報に他人に知られたくないメールアドレスは使用しないでください)が追加されて,リアルなメールアドレスを3つ登録してしまった私は涙目になっています.

URLに注目してみると,そもそもcgiで動作していることが分かります.大方Perlで書かれていると考えられます. つぎに,アクセス先がDocumentRootではない(つまりregister.cgiであって/にアクセスしてない)ので,一度そちらに移動します. するとregister.cgi_bakがあるので,そのコードを読むことが出来ます.

コード中で注目するべきは,open関数からsendmailを呼び出している点です. ここまで述べれば,あとは完全に自明でOSコマンドインジェクションを利用してファイルを読みます. どうやら,誰かがSECRETS/backdoor123.phpというバックドアを置いていたのでそれを利用して,cat ../logすればflagが得られます.

open関数によるOSコマンドインジェクションはIPAのセキュアPerlプログラミングが参考になります.

Exec dmsg

Please find secret message from the iso linux image.
image.zip

秘密のメッセージをLinuxのisoイメージの中から見つけてください。
image.zip

うーん……という感じの問題.

タイトルどおりで,単純にdmsegを実行すれば良い問題.ただし,問題としてはlinuxのiso内にdmesgがインストールされておらず実行に手間取るよねという問題.

一番初めに取った方針はcat /dev/kmsg | grep SECCONを検討. ただ,何故かよくわからないけど,うまく行かなかったというか失敗してしまい,面倒くさいと放置して次の日朝起きて解いた.

結局,TinyCoreLinuxをダウンロードしてきて,dmsgのバイナリをgmailで一度送信してSECCONのイメージに移植というアホとしか言いようがない手法で解いた.

SECCON{elf32-i386}

TLを眺めていると,当初の計画で問題がなかったようで,完全に事故った.

Decrypt it

$ ./cryptooo SECCON{*************************}
Encrypted(44): waUqjjDGnYxVyvUOLN8HquEO0J5Dqkh/zr/3KXJCEnw=

what's the key?
cryptooo.zip

人力で無理矢理解いた.

バイナリに関しては,得意分野ではないのでわからないのだが. バイナリを調べてみると,64bitなバイナリファイルで,objdumpをしたらmainが無いというバイナリアン向けのバイナリであった. 解くのを諦めようとしたが,どんな時でもその文字列に対して一意な暗号文が返却される(つまり./cryptoo mikuを何度実行しても暗号文は変わらない)という特徴があった. また,暗号化された文章はどう見てもbase64 encodeされた文字列である.

まとめると……

  • 暗号化にrand()は使用されていない(objdumpを呼んでも呼び出されてないし,暗号文は何度呼び出しても変わってない)
  • 暗号文はbase64 encodedなもの

これらを考慮して,数文字ごとの総当り的作戦ができると推測. つまり……

  1. 与えられたフラグの暗号化後の文字列とSECCON{[a,b,c...]のように任意の文字列を追加して暗号化を行った文を比較する.
  2. 部分一致,もしくは完全一致を調べて行って暗号文を確定させていく.

で,実際にpythonのコードを作成しある程度自動化していきました.

実際の作業風景はこちら.

f:id:nmkn:20151216202336p:plain

当初,この部分一致も自動化しようと思ったのですが,致命的に頭が悪くロジックが浮かばなかったのでやめました. 今後は頭を良くする方法を考えていきたいです.

その他

一応他に挑戦してたのが,QR puzzle(nonogram)とFragment2,4042をやってました. Fragment2はそもそも論として,頭が致命的に悪くHTTP 2のパケットだと全く考えておらずという感じです. QR Puzzleは向こうの方は完全に正しい(エラーのない)QRコードを出してくるもんだと思って,馬鹿正直にソルバー書いたら,死にました. 4042の方は,RFC4042(April 1 2005となってたのでジョークRFCみたいですね)には気付いたものの,これを解決するスクリプトを書く時間がありませんでした.やはり,人員不足は否めない.

頻繁にQRが出てくるCTFは,SECCONとTDUCTF(LepusCTF)のような気もしますが,ある程度処理を自動化出来るスクリプトを用意したほうが良いなと感じました.

感想(LepusCTFにからめて)

LepusCTFでもCTFの運営をやっていて感じることが,CTFは以下のように部類出来るのではないかな,と.

  1. 「ユニーク系(絶対起きないセキュリティホール)」
  2. 「現実系(起きうる,もしくは脆弱性が発生したシナリオが明確)」
  3. 「おもしろ系(あまりセキュリティ等を考えていない)」

今回のSECCONは,おそらくはセキュリティ的な問題よりどちらかといえば,コンピュータの深いところの知識を問う「おもしろ系」だったのかな,と感じます. 今回もそうですが「あっ,こんな面白いこともあったのか」という発見もあるので毎度楽しみに参加しています. 個人的にはセキュリティに限らずというところがあるので,面白いなぁと思って参加しています.

とはいえ,SECCONは現状規模が大きく「人材育成が?と言っている手前,どうなんだ」と指摘しているのも見かけました. 自分がとやかく言うつもりはないですが,確かにそうだなぁと思う節もあります.

SECCONのみならず,LepusCTFの方でも今後どういう風に問題を作成していかなきゃいけないのかは毎度悩んでいる節があります. 個人の意見としては,CTFは楽しいものであるべきだと考えているので理想的には楽しかったなぁという感想しか無いように考えていきたいものです.

ともあれ,次回LepusCTFにご期待下さい.

感想(個人的な)

bonsaiがツラすぎたのと,Find the prime numbersもうちょい時間があれば解けたような気がする. うーん,流石に2人だとあまり長く問題にかかりっきりになってしまうとタイムオーバーで解けたはずの問題すら解けなかったみたいなことが起きてしまうので,難しい. やはり,人員が欲しいが各個人のやる気や,タスクに依存するところが多いので下手に人も増やせないと思ったりもする.

bonsai,単純にWebだけしか考えてなかったがNetworkも踏まえて考えると良問だなぁ,と感じた. 正直,今までにないパターンだったので全く考えが及ばなかった. あと,いつもLinuxマンなので1024までのポートでListenするならUAC出るでしょとか考えてたのも敗因かも?

でも,一年間で成長したなと感じたところもあったのでそういう意味ではとても成長を実感できた面白いCTFでした.

今後はチームとして人員不足の解決をしなくてはいけないんだなぁ,と感じました.

TDUCTF(LepusCTF)開催秘話

この記事について

この記事は,さくらインターネット Advent Calendar 2015の12日目の記事です.

昨日は,misodengakuの「TWE-Liteで温度監視ネットワークを作る」でした.

昨日がmisodengakuで,明日はこたまごせんせーとなっていてどちらも,LepusCTFの運営の人なのですごく身内感が有りますね!

あとあと,この記事はLepusCTF(TDUCTF)で極めてさくらインターネットさんにお世話になったので,それに感謝の意を示す記事です. ので,「ありがとうございます」しか言えなくなっているので大変申し訳無く……

TDUCTFとは

「LepusCTFの話」というタイトルなのにTDUCTFとは何なんだという感じなのですが,まだその名前ではLepusCTFを開催していないので,前身の話を…….

TDUCTFとは,TDUすなわち東京電機大学の学生が集まって開催をしていたCTFです. ちなみに,CTFはコンピュータに関してセキュリティを中心の問題を解いていく競技です.とてもおもしろいです.

現在ではいろいろな人が集まって手伝って頂いている(大学もお金くれないし)現状も踏まえてLepusCTFとして名前を変えて活動を行っています. よくよく考えてみると,過去を振り返っていくと名前の変更は2回ありました.

  1. mlabCTF
  2. TDUCTF
  3. LepusCTF (現在)

実は,mlabCTFというのがあって学内に起こりうる脆弱性みたいな感じで,問題を作成し始めたのが始まりでした. そんなことを繰り返していくうちに,いろんな人が参加して,また規模も大きくなって現在のLepusCTFにまでなりました.

そろそろ,LepusCTF 1stの開催も考えていきたいです.

ちなみに,今回お話するTDUCTF 2015開催の様子はさくらインターネットさんのさくらのナレッジにまとめていただきました.

『ゆるく、適当に』をモットーに。参加者72名が順位よりも「楽しくプレイ!」-「TDUCTF 2015」レポート-

馴れ初め

最初にさくらインターネットの方とお話したのは,とあるセキュリティ系のインターンシップ説明会のようなところででした.

当初,正直なところ無料でご飯が食えると聞いてノリノリで私服で行ったら,普通にスーツで参加している人もいて,ガチの就職活動的な場所だったんだ……と肩身狭い思いをしていました. とはいえ,ちょうど同じようにいらっしゃっていた,よしけんさんも私服だったので,二人してひたすらに飯を食っていました.

ふと,その時のことを思い出すと後で連絡するからと言われて名刺を渡した企業の人が,後で連絡をくれなかったのでなるほどなぁと思いました.

ともあれ,そんな感じで楽しんでいたところさくらインターネットさんの人事担当の方が話しかけてくださって,そこから実は僕の活動しているCTFでさくらインターネットさんの社員の人がいるんですよ,という感じで話をしたのが初めてでした.

先ほど書いたように,私服でひたすら飯を食い続ける異質な人に声をかけてくださった人事担当の方には今でも感謝しております.

開催日決定前夜

確か,その日のうちにチームのSlack内で報告して次の日程を話し合っていたはず.(結構前でログを遡れない) その後,8/29(前日準備),30(当日)でお部屋を借りれないかという形で話がまとまり,さくらインターネットの人事の方に連絡した形となりました.

開催に際して,インフラも会場もさくらインターネットさんに提供していただけることになり,当初はひとまずさくらのVPSを1年間提供しますとのことでしたが,さくらインターネットさんの中で調整をしてくださり,数台さくらのクラウドを利用出来るようにしてくださいました.

さくらのクラウドについて余談

ここで一回話を切りますがさくらのクラウドはすごいですね. 基本的に,お財布事情がよろしくないので今までクラウドは大して利用したこと無くて,せいぜい学生無料で(ある程度)利用できるAzureを利用したくらいでした. その後,某キャンプでAWSもほんのちょっとだけ触りましたが,それらと比較してさくらのクラウドは非常に簡単に操作できるし,ネットワークの管理もグラフィカルに設定できてとても便利です.

なにより,さくらのクラウドクラウドサービスの中でもインストールイメージとしてArchLinuxが提供されている唯一のクラウドサービスです!! (おそらく.VPSサービスを除く)

これに関しましては,某キャンプでちょうどさくらのクラウドの中の人とお話をした際に,ぜひArchLinuxのイメージを提供してもらえないかとお願いをしたところ「いいですよ?」と軽い返事を頂いたのがきっかけです. 当時,まぁArchLinuxは入らないよねと考えたいたのですが,その2ヶ月後にリプライで追加されたと聞いてむっちゃ驚きました.

ここまで軽いフットワークのクラウドサービスは無いでしょう.本当にすごいです.

準備編

その後,開催の準備となります. 問題の締め切りを定めて,さくらインターネットさんに打ち合わせに行ったりしました.

おおよそ,問題に関しては運営の中の人が考えます.作業の流れは結果的に以下のように作業しました.

  • イデアの共有(ex. AngelBeats!のゲームみたいなCD認証面白くないですか?)
  • プロによる実装(ex. とすると,こんな感じのどうですか?)
  • 問題登録(ex. 作りました)
  • 全ての問題が登録された段階で点数を決定(ex. 点数は?にしましょう)

(なおこのあとに,難易度調整や所要時間の考え方に問題があるとして,今後のフローでは問題登録後に問題レビューとレビュアーによる暫定点数を決めるというのが追加されています

打ち合わせでは,まずCTFとはどういうものなのかをご紹介したあと,前回参加者の年齢比率であったり前回の内容についてご紹介しました. こういった際に一応紹介スライドを用意しているのですが,内容がちょっとあれすぎるのでスライド自体は未公開にさせてください.

軽くスライドの内容を述べるのであれば,

  • CTFについて
  • CTFの形式
  • 前回の様子と参加者
  • 今回検討しているCTFについて

みたいな感じです. また,今回の想定している参加者数についてもご相談しました.

参加者に関しては当初部屋のキャパシティの関係で40名しか入れず,その方向で調節を行っていました. ので,イベントページも,最初は40名で募集していました.

ですが,「机と椅子さえあれば人を入れられるのでは?」とさくらインターネットさんからお声がけをいただき,わざわざさくらインターネットさんが机と椅子を借りてくださいました.全く持って頭が上がりません. これにより,2週間前に枠を72名に拡張することができました.この場を借りてお礼を伝えさせていただきたいと思います.ありがとうございます!!

また,さくらインターネットさんから各種ノベリティのご提供もいただきました.当初,打ち合わせ段階ではさくらインターネットさんから「お腹減るんで軽くお菓子等あったらいいですよね」とのお話を頂いて,ご用意いただけるなら大変うれしいですとお伝えしました. この段階では袋菓子を何個か購入して配布かなぁ,と思っておりましたが,当日来てみたらダンボールがドンと置いてあってびっくりしました.

当日は,柿ピー(写真参照)と水,RedBull(写真撮りわすれましたごめんなさい)をご提供していただきました!ありがとうございます!

また,ノベリティとしてさくらのクラウドのクーポンと,ノート,クリアファイルまで配っていただきました. 本当に何から何までご提供いただいて,頭が上がりません.

また,懇親会の食事も実はさくらインターネットさんにご提供していただきました. ので,今回は懇親会も無料で開催することが出来ました.大変感謝です. 実は,懇親会の時「もしかしてピザとか足りないかな」と,声までかけてくださいました.なんて優しいんだ……. おかげさまで,多くの方とお話する機会も作れました.ありがとうございます.

開催後

実はつい先日まで競技環境がそのまま残っていました.つまりは,クラウドのアカウントが11月まで有効となっておりました. 残していただけるのであれば,可能な限り長い間残してもらえると嬉しいと伝えたところ,11月までご提供してくださいました.大変有難うございます.

ログ等の確認もゆっくり出来まして大変感謝をしております.

また,次回の開催から「TDUCTF」という名前を「LepusCTF」という名前に変更することとなりました. それに伴い,インフラ系を全て新しい物に切り替え,新名称の告知も行ったのですが,今振り返ってみるとどうやらこれらを4時間足らずでやっていたようです. 我ながらフットワークが軽いなぁと感じています.

次の話

さて,そろそろ次回のことを考えなきゃいけないですね. 次回がLepusCTFという名前での初の開催になります. 問題についても過去の反省を元に,ちょっと違う雰囲気な問題も何個か置けたらいいなと考えています.

硬い雰囲気ではなく,ゆるく適当に面白く開催できればなぁ,と考えております.

ちなみに,告知等は公式サイトや,公式Twitter等で告知していきます. ぜひぜひ,こちらもご確認・フォローしていただければと思います. 多分,次回開催についての情報はTwitterの方が早いと思いますので,ご参考にしていただければ.

……長い文章になってしまいました.疲れたのでそろそろチョコレートとか食べながら次回開催を考えていきたいです.

次のアドベントカレンダー

次の「さくらインターネット Advent Calendar 2015」は,こたまごせんせーの「Marathonを使ってWebアプリのBlue/Greenデプロイを簡単にするツール」のようです.

ConoHaでArchLinuxのサーバーを建てよう

この記事はNomuken氏の手作業による優しい気持ちで復元されました

この記事について

この記事は,美雲このはちゃんで有名なConoHaアドベントカレンダー13日目の記事です.

昨日は,naoto_gohkoさんによる「ConoHaのVMでUbuntu 14.04を使ってs3qlでSwift Object Storageをマウントする」でした.

明日は,tisiharaさんによる「ConoHaでNetBSDのサーバーを建てよう」です.

そうだArchLinuxでサーバーを建てよう

と,思っている皆さんも極めて多いと存じます.

ArchLinuxの詳しい概念等を知りたいのであれば公式の「The Arch Way」が参考になります. 軽快かつ,シンプル,柔軟という点に置いてArchLinuxはサーバに利用するメリットは大きいのではないでしょうか.

特に,VPSサービスの中でISOイメージをアップロードせずにArchLinuxを利用できるのはConoHaだけ!!(おそらく.クラウドは除く) これは,ConoHaでArchLinuxを利用するしかないですね!!

ArchLinuxをサーバ用に選ぶメリット・デメリット

ArchLinuxをサーバに選択するメリットとしては以下の物が上げられるでしょう.

  1. 設定ファイルがシンプル(勝手な設定が行われていない)
  2. ユーザの判断でしか動作しない(勝手にサービスを立ち上げて有効化しない)
  3. 常に最新版
  4. 軽い

逆にデメリットとしては以下のものが上げられるでしょう,

  1. 自分で設定しなければいけない(よくある設定はされない)
  2. インストールしてもすぐには動かない(自分で設定しなくてはいけない)
  3. 互換性を考慮せずに常に最新版が降ってくる(不用意にバージョンアップすると設定ファイルが互換性が無くて起動しない)
  4. インストールが大変(自分でインストールするパッケージを選ばなくてはいけない)

これらに対して,多くの議論があるとは思いますがこの記事では触れません.

実際にArchLinuxをサーバとして使えるのかという質問があれば,今見ているこのサーバ(spica.bz)はArchLinuxで動いています. ArchWikiでは,ArchLinuxをサーバ用途に利用することに対して次のように述べています.(ArchWiki - サーバー

次のような批評または主張を見たことがあるかもしれません: Arch Linux はサーバーのオペレーティングシステムには全く向いていない!。これは真実です: サーバーのインストールディスクというものは存在していません。他のディストリビューションでは用意されているようなディスクのことです。これは Arch Linux には最小限の (しかしながら堅実な) ベースシステムしか含まれていないためで、初めからインストールされているデスクトップまたはサーバーとしての機能は、ほんのわずかしかありません。ただし、このことは Arch Linux をサーバーとして使うべきでないということを意味しません。むしろ正反対です。

実際のところ考えは人によると思いますが,ArchLinuxをサーバ用OSとして選択することは全くありえない選択では無いと思います.

ConoHaにインストール

ConoHaでは旧・新の両方ともArchLinuxを利用することが出来ます. ただ,まだ私の場合は旧ConoHaにクーポンが残っておりますので,今回はそちらを利用してArchLinuxのインストールを行いたいと思います. (旧ConoHaにクーポンが残っていて,そちらにArchLinuxをインストールして試してみたいという方も多いと思うので……)

もちろん,新ConoHaの手順も解説していこうと思います.

インストール

今回の目的はサーバとして最小限の役割をする単純なsshサーバを構築しましょう.

1.ArchLinuxのISOイメージから起動する

旧ConoHaの場合

適当なプランでひとまずCentOS仮想マシンを作成します. 作成したら,仮想マシンのラベルをクリックし,開いた画面のその上のメニューから,ArchLinuxのISOイメージを選択します.

f:id:nmkn:20151216191355p:plain

これですね.

f:id:nmkn:20151216191327p:plain

こちらを選択すると,起動がArchISOから行われるようになります.

また,旧ConoHaではディスクが20GB + 80GBになってしまっているのでVMのメニューからVM設定を選択し,ディスクの構成変更を行います.

f:id:nmkn:20151216191412p:plain

新ConoHaの場合

左側のメニューから,仮想マシンの追加を選び,仮想マシンを作成します.

新ConoHaでは新しい絵柄のこのはちゃんもいるので可愛いですね. 以下のところからArchLinuxを選択します.

f:id:nmkn:20151216191448p:plain

ただ,このはちゃんが白で切れてしまうので,これを半透明とかにすればよりこのはちゃんが近くて良いかなぁと思います.

2.起動

今頃,32bitをArchLinuxを使っている人でわざわざ選択する必要が無いと思うので,64bitでブートします.

f:id:nmkn:20151216191429p:plain

一番上の,Boot ArchLinux (x86_64) を選択(Enter)して起動しましょう.

以下のような画面になるまで待ちましょう.

f:id:nmkn:20151216191512p:plain

もし,他のLinuxをお使いの方はお気づきかもしれませんが,archisoではzsh + grml-zsh-configがデフォルトで装備されています. それではArchLinuxをインストールしていきましょう.

3. インストール

インストールはArchLinux公式ドキュメントのBeginners' guideを参照しながら以下の記事を読むと良いと思います.

3.0.インストールその前に (旧ConoHaのみ)

旧ConoHaは,旧ということでArchLinuxのインストールイメージがメンテナンスされていません.つまり何がいいたいかというと,異常にarchisoが古いです.2014-08-01のバージョンです.

あまりにも古い場合,以下のようなエラーで後述のpacstrapでパッケージのインストールに失敗します.

downloading required keys...
:: Import PGP key 4096R/, "Seblu <seblu@seblu.net>", created: 2011-11-11? [Y/n] y
error: key "Seblu <seblu@seblu.net>" could not be imported
:: Import PGP key 2048R/, "Christian Hesse (Arch Linux Package Signing) <arch@eworm.de>", created: 2011-08-12? [Y/n] y
error: key "Christian Hesse (Arch Linux Package Signing) <arch@eworm.de>" could not be imported
:: Import PGP key 4096R/, "Antonio Rojas <arojas@us.es>", created: 2014-10-21? [Y/n] y
error: key "Antonio Rojas <arojas@us.es>" could not be imported
error: required key missing from keyring
error: failed to commit transaction (unexpected error)
Errors occurred, no packages were upgraded.

これは,パッケージの信頼性を検証するための署名が古すぎるために起きるトラブルです. このスレでも述べられていますが,archlinux-keyringの再インストールで回避することができます. 以下のコマンドを試してみてください.

# pacman -S archlinux-keyring
# pacman-key --populate archlinux

(実はarchlinux-keyringをインストール時に,自動的にもうひとつのコマンドが実行されるので,本当は必要ないのですが今後どうなるかわからないため,一応記載しました)

3.1. パーティションを決める

今回は話をシンプルにするため,以下のようにしたいと思います.GPT/BIOSで構築を行います.

  • /dev/sda1 (100M) : BIOS boot Part
  • /dev/sda2 (その他全て) : /

それでは,gdiskを用いて設定を行いましょう.

 # gdisk /dev/vda
GPT fdisk (gdisk) version 0.8.10

Partition table scan:
  MBR: MBR only
  BSD: not present
  APM: not present
  GPT: not present


***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format
in memory. THIS OPERATION IS POTENTIALLY DESTRUCTIVE! Exit by
typing 'q' if you don't want to convert your MBR partitions
to GPT format!
***************************************************************


Warning! Secondary partition table overlaps the last partition by
33 blocks!
You will need to delete this partition or resize it in another utility.

Command (? for help): o
This option deletes all partitions and creates a new protective MBR.
Proceed? (Y/N): y

Command (? for help): n
Partition number (1-128, default 1):
First sector (34-41943006, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-41943006, default = 41943006) or {+-}size{KMGTP}: +100M
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): ef02
Changed type of partition to 'BIOS boot partition'

Command (? for help): n
Partition number (2-128, default 2):
First sector (34-41943006, default = 206848) or {+-}size{KMGTP}:
Last sector (206848-41943006, default = 41943006) or {+-}size{KMGTP}:
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/vda.
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
The operation has completed successfully.

以上では以下のような操作をしていました.

  • GPTでパーティションテーブル再度作成 (Command: o)
  • BIOS boot partitionの作成 (Command: n -> Enter -> +100M -> ef02)
  • /パーティションの作成 (Command: n -> Enter -> Enter -> Enter)
  • パーテョンテーブルの書き込み

あとは大幅にパーティションテーブルを改変してしまったので,再起動してカーネルに現在のパーティションを再度認識してもらいましょう.

# reboot
3.2. SSHからの操作に変える

再起動を終えたら,今後の操作を楽にするためSSH経由でのインストールに変更します. 以下の操作を行います.

以下のコマンドを打ち込みます.

# passwd
Enter new UNIX password: <パスワードを入力し,Enter>
Retype new UNIX password:<再度パスワードを入力>
passwd: password updated successfully

# systemctl start sshd

# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether                   brd ff:ff:ff:ff:ff:ff
    inet                 brd 157.7.53.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6                                      scope global noprefixroute dynamic
       valid_lft 1291898sec preferred_lft 82298sec
    inet6                             scope link
       valid_lft forever preferred_lft forever
    inet6                              scope link
       valid_lft forever preferred_lft forever

あとは,設定どおりにSSHに接続を行えば大丈夫です.

ちなみに,LinuxもしくはMacユーザならTerminalで以下のコマンドをSSHで入力すれば接続が可能です.

$ ssh root@<ConoHaサーバのIP>
3.3.新環境にパッケージをインストールする

ここから,ArchLinuxの基本システムとその他使うでしょというソフトウェアのインストールを行います.

……の前に,インストールの高速化のため日本のミラーサーバからのダウンロードを行います. お好きなエディタで,pacmanのmirrorサーバリストを開き,日本のサーバを最上位にコピペします. 私は,vim以外のエディタを知らないのでvimを用いて編集します.(旧ConoHaのarchisoではvimが無かったためviで編集)

# vi /etc/pacman.d/mirrorlist
# head /etc/pacman.d/mirrorlist
##
## Arch Linux repository mirrorlist
## Sorted by mirror score from mirror status page
## Generated on 2014-08-01
##

Server = http://ftp.tsukuba.wide.ad.jp/Linux/archlinux/$repo/os/$arch

## Score: 0.5, Germany
Server = http://mirror.k42.ch/archlinux/$repo/os/$arch

それでは,ローカルにインストールしていきましょう.以下のような作業を行います.

# lsblk
NAME            MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sr0              11:0    1   559M  0 rom  /run/archiso/bootmnt
vda             254:0    0   100G  0 disk
├─vda1          254:1    0   100M  0 part
└─vda2          254:2    0  19.9G  0 part
loop0             7:0    0 241.3M  1 loop /run/archiso/sfs/airootfs
loop1             7:1    0    32G  1 loop
└─arch_airootfs 253:0    0    32G  0 dm   /
loop2             7:2    0    32G  0 loop
└─arch_airootfs 253:0    0    32G  0 dm   /

# mkfs.ext4 /dev/vda2
Proceed anyway? (y,n) y

# mount /dev/vda2 /mnt

# pacstrap -i /mnt base base-devel vim zsh grml-zsh-config grub
Enter a selection (default=all): <Enter>
Enter a selection (default=all): <Enter>

Total Download Size:    239.54 MiB
Total Installed Size:   854.49 MiB

:: Proceed with installation? [Y/n] y<Enter>
...skip

見やすさの都合上,必要最低限の場所以外は省略しました.これで,ArchLinuxが動作する最小環境(と,使いやすくする各種ツール郡)のインストールが行われます.

3.4.新環境へのchroot

ArchLinuxは自分で設定しない限り有効になりません.ですので,ブートの設定やパスワード等も自分で行わなければなりません. 現在インストールしただけでは,ブートも出来ないのでarch-chrootと呼ばれるコマンドで新環境に入り設定を行っていきます.

ここでは以下のことを行います.

  • genfstabでfstabの内容を生成する
  • arch-chrootコマンドで新環境に移動
  • システム全体のロケールの設定
  • タイムゾーンの設定
  • ハードウェアクロックの設定
  • ホスト名の設定
  • ネットワークの設定
  • rootのパスワードを設定
  • grubブートローダ)を設定

今回は動作が多いので,補足しながら説明します. この章だけコマンドプロンプトroot@archiso ~ #と表現します.

・fstabの自動生成
root@archiso ~ # genfstab -p /mnt > /mnt/etc/fstab

・新環境に移動
root@archiso ~ # arch-chroot /mnt /bin/zsh

・ロケールの設定
root@archiso / # vim /etc/locale.gen

<以下の箇所を変更>
163行目あたり 
#en_US.UTF-8 UTF-8
↓(コメントを外す)
en_US.UTF-8 UTF-8
288行目あたり
#ja_JP.UTF-8 UTF-8
↓(コメントを外す)
ja_JP.UTF-8 UTF-8

root@archiso / # locale-gen
Generating locales...
  en_US.UTF-8... done
  ja_JP.UTF-8... done
Generation complete.
root@archiso / # echo "LANG=ja_JP.UTF-8" > /etc/locale.conf

・タイムゾーンの設定
root@archiso / # ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

・ハードウェアクロックの設定
root@archiso / # hwclock --systohc --localtime

・ホスト名の設定,ここではホスト名を「conoha-chang-prpr」とする
root@archiso / # echo "conoha-chang-prpr" > /etc/hostname

・ネットワークの設定,ConoHaではIPアドレスがDHCPで落ちてきてくれるので自動設定にする
root@archiso / # systemctl enable dhcpcd

・rootのパスワードの設定
root@archiso / # passwd
Enter new UNIX password: <パスワード入力してEnter>
Retype new UNIX password: <再度パスワード入力してEnter>
passwd: password updated successfully

・grubの設定
root@archiso / # grub-install --recheck /dev/vda
Installing for i386-pc platform.
Installation finished. No error reported.
root@archiso / # grub-mkconfig -o /boot/grub/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-linux
Found initrd image: /boot/initramfs-linux.img
Found fallback initramfs image: /boot/initramfs-linux-fallback.img
done

以上で,セットアップ完了です.

余談ですが,ハードウェアクロックの設定をArchLinuxが推奨しているutcではなくlocaltimeに設定している理由は,ConoHaのホストマシンの時刻設定との兼ね合いです. 非推奨で気持ち悪いかもしれませんが,今後もlocaltimeという設定は無くならないので,このように設定しましょう.

3.5.OpenSSHのインストール

それでは,一応今回の目的であるOpenSSHのインストールを行いましょう. ArchLinuxではpacmanと呼ぼれる最強なパッケージマネージャによってパッケージが管理されています. 以下のように打ち込んでみましょう.

root@archiso / # pacman -S openssh
error: failed to initialize alpm library
(database is incorrect version: /var/lib/pacman/)
error:   try running pacman-db-upgrade

ああっと,忘れてました.pacmanのデータベースを初期化し,アップデートするのを忘れていました. 以下のコマンドを打ち込んでみてください.

・データベースのアップグレード
255 root@archiso / # pacman-db-upgrade
==> Pre-4.2 database format detected - upgrading...

・データベースの更新
root@archiso / # pacman -Syy
:: Synchronizing package databases...
 core                                                                                                                                       121.2 KiB   148K/s 00:01 [######################################################################################################] 100%
 extra                                                                                                                                     1774.7 KiB   932K/s 00:02 [######################################################################################################] 100%
 community                                                                                                                                    3.1 MiB  1924K/s 00:02 [######################################################################################################] 100%

これで,大丈夫.再度打ち込んでみましょう.

root@archiso / # pacman -S openssh
resolving dependencies...
looking for conflicting packages...

Packages (4) dnssec-anchors-20150403-1  ldns-1.6.17-3  libedit-20150325_3.1-2  openssh-7.1p1-1

Total Download Size:   1.19 MiB
Total Installed Size:  6.21 MiB

:: Proceed with installation? [Y/n] y
:: Retrieving packages ...

(省略)

Optional dependencies for openssh
    xorg-xauth: X11 forwarding
    x11-ssh-askpass: input passphrase in X

root@archiso / # vim /etc/ssh/sshd_config

<今回は都合上以下を修正>
(44行目辺り)
#PermitRootLogin prohibit-password
↓以下のように修正
PermitRootLogin yes

root@archiso / # systemctl enable sshd

今回は,再起動後にユーザを作成しようと考えているため,sshでrootのログインを許可しようと思います. 後で,必ず修正を行ってください.

ArchLinuxにおけるトラブルシューティングの半分くらいは,表示されたエラーメッセージを理解することで修正することが出来ます. なので,トラブルが発生したらまず一度エラーメッセージを確認しましょう.

3.6.chrootから脱出,再起動

それでは,chroot環境下から脱出して再起動しましょう.

root@archiso / # exit
root@archiso ~ # umount -R /mnt
root@archiso ~ # poweroff

再起動コマンドはrebootですが,poweroffを利用しているところに注意してください. これは,ConoHaにおいてISOイメージが残っている場合に再起動してもそのISOイメージからまたブートしてしまうためです. (少なくとも,旧ConoHaの場合,新ConoHaは忘れちゃいました ;P)

ISOイメージを排出していることを確認したら,再度起動しましょう.旧ConoHaでは上のメニューから行えます. レッツ強制排出☆ システムがシャットダウンしているなら,強制の方を選択しても構いません.

3.7.IYH

f:id:nmkn:20151216191607p:plain

これで,インストールは完了です. OpenSSHの設定も行ったので,ちゃんとSSHで入れるかも確認しましょう.

$ ssh root@<ConoHaサーバのIP>
3.8. インストールのその後

一応,ここまででインストールが完了しました.が,流石にこれでは使い物にならないので,更に最低限これくらいは……という設定を行います.

  • nomukenユーザの追加
  • githubからsshで使う公開鍵のダウンロード
  • sshdの設定変更
・ユーザの追加
[root@conoha-chang-prpr ~]# useradd -m -g users -G wheel -s /bin/zsh nomuken

・作成したユーザのパスワードを変更
[root@conoha-chang-prpr ~]# passwd nomuken
新しい UNIX パスワードを入力してください: <パスワードを入力してEnter>
新しい UNIX パスワードを再入力してください: <再度パスワードを入力してEnter>
passwd: パスワードは正しく更新されました

・sudoを使えるようにする
[root@conoha-chang-prpr ~]# visudo

<以下を編集>
(82行目あたり)
# %wheel ALL=(ALL) ALL
↓(コメントを外す)
%wheel ALL=(ALL) ALL

・nomukenユーザに切り替える
[root@conoha-chang-prpr ~]# su nomuken
/etc/zsh/zshrc:cd:1630: 許可がありません: /root

・sshの鍵をインストールする
nomuken@conoha-chang-prpr ~ % mkdir .ssh
nomuken@conoha-chang-prpr ~ % curl https://github.com/nomuken.keys > .ssh/authorized_keys
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   381    0   381    0     0    459      0 --:--:-- --:--:-- --:--:--   463
nomuken@conoha-chang-prpr ~ % chmod 700 -R .ssh

・sshの設定を正しく設定する
nomuken@conoha-chang-prpr ~ % sudo vim /etc/ssh/sshd_config
[sudo] nomuken のパスワード: <nomukenのパスワードを入力してEnter>

<以下を編集>
(44行目辺り)
PermitRootLogin yes
↓以下のように修正
PermitRootLogin no

(72行目辺り)
#PasswordAuthentication yes
↓以下のように修正
PasswordAuthentication no

nomuken@conoha-chang-prpr ~ % sudo systemctl restart sshd

以上で設定は,完了ですお疲れ様でした!!

まとめ

ArchLinuxのインストールいかがだったでしょうか?おそらく相当面倒くさく,時間もかかったものと思います. 最後に,私が何故ArchLinuxをサーバで利用しているかポエムを書いて終わりたいと思います.

ArchLinuxは何度も言うように,自分で設定しないと,何も動かない性質を持つディストリビューションです. 他のLinuxでは,インストールした瞬間に「よくある設定」がなされ,それがデーモンとして動くものなら「即座に有効化され起動」します. 個人的に,この挙動はあまり好きではありません.何故ならばそのよくある設定が自分の環境に適するものであるとは限らないからです.

ArchLinuxでは,面倒くさく,相当量調べることを要求されることとなりますが,ユーザに本当の意味でのコントロールが与えられます. そういう意味でも,個人的にセキュアなOSだと思っています.

ともあれ,お疲れ様でした.以上でConoHaアドベントカレンダー13日目の記事とさせていただきます.ありがとうございました.

P.S. このはちゃん,遅くなってごめんなさい