鯖防人は忘れる。

機械音痴の鯖防人が忘れないように…

NICTのEXISTをDockerで立ててみた

みなさんこんにちは.機械音痴の鯖防人です.

今回はセキュリティ(?)ネタです.


天下のNICTさんがセキュリティに関するいろんなツールを作っています.

たとえばNIRVANAであったり,NICTERであったり...

いろいろあるんですが,ちょっと前に”EXIST"という、サイバー攻撃に関する脅威情報を集めるツールが発表されました。

そしてなんと、MIT Licenseで公開されています。

けっこういろいろ機能があって面白く、使えそうだったので
これをDocker使って構築するためのDockerfileを書いてみました。

Dockerfileにいろいろ書くのはあまりお行儀良くないのですが…(笑)

GitHubでMIT Licenseにて公開しています。
github.com

EXISTの構築の仕方は、公式のほかにも説明してくださっている方がいらっしゃいますし、
Dockerでの構築事例もあります。

良かったらそちらも検索してみてください。


ちなみに、先日開催されたInterop Tokyo 2019で、
攻撃を可視化するNIRVANA改弐や、NICTER、STARDUST、EXISTなどと連携するCUREなどの
デモを見てきました~
youtu.be
なんかクルクル回ってましたね…
(CUREこれ可視化する必要性あるのかn(殴)


では。

参考
GitHub - nict-csl/exist: EXIST is a web application for aggregating and analyzing cyber threat intelligence.
サイバー脅威情報集約システム EXIST

Samba Active DirectoryへのLDAPによるユーザ追加

こんにちは。
機械音痴の鯖防人です。


先日、自身が所属する研究室のメンバーを管理する、ADをSambaを使って立てました。
今回はそのことについて、ちょっとお話ししようかと思います。

以前はOpenLDAPを使っていたのですが、RADIUS連携する際にパスワードの扱いにちょっと困ってしまったので
研究室の認証基盤の不調を機に、構築し直すことにしました。

OpenLDAPの構築事例を見ると、SSHAを使っている場合が多いのですが
SSHAはハッシュなので、RADIUSとかで使うときに困ります。(困りました)

そのため、以前は、アカウント登録の際に、LDAPRADIUSRDBバックエンド)両方に登録を行うという
非常~に頭の弱いやり方を採用していました。。

RADIUSを前提としたOpenLDAPの構築事例は無いのかと探してみれば、
LDAPにパスワードを平文で登録していて「おいおい…」となりました。

この辺実運用ではどうやってるんですかね…
(まぁ社内システムとかでOpenLDAP&FreeRADIUS使ってるなんてことは無いか…)


と、いうわけで
これを解決するために、Active Directoryを構築することにしました。

SambaでADを構築すれば、タダです。

なお、Samba Active Directoryの構築・設定の仕方は、ここでは説明しません。

このページなどを参考にしてもらえればいいと思います。
www.rem-system.com


それでは本題。

Samba Active Directoryを扱っている事例はそこそこあったのですが、
LDAPでユーザ追加する方法を紹介しているサイトがあまりなかったので
備忘録的に書いておきます。

通常、LDAPは、認証などはTLSを使わずに行うことが多いのですが
Sambaの場合、LDAPS強制でした。
(ここを、面倒だと思うか、安全で良いと思うか)

ですので、Samba ADにLDAPで接続するときは、LDAPSを使います。

ldaps://hogehoge で大丈夫です。

次に、ユーザアカウントの属性ですが、
基本Windows Serverに従っているので、それを参考にしたら良いんだと思いますが
docs.microsoft.com
今回は、以下のような属性にしました。


属性名



objectClass

top

objectClass

person

objectClass

organizationalPerson

objectClass

user

sn

Doe(苗字)

cn

10001(コモンネーム(社員番号など))

instanceType

4

objectCategory

CN=Person,CN=Schema,CN=Configuration,DC=test,DC=local

displayName

John Doe(表示名(氏名など))

sAMAccountName

10001(cnと同じ)

userPrincipalName

10001@test.local

userAccountControl

512 ※1

distinguishedName

CN=10001,CN=Users,DC=test,DC=local

uid

10001

homeDirectory

/home/10001

loginShell

/bin/bash

uidNumber

10001

gidNumber

10001

unicodePwd

※2
※1
基本的に512を指定します。512は一般的なアカウントを示します。
https://support.microsoft.com/ja-jp/help/305144/how-to-use-useraccountcontrol-to-manipulate-user-account-properties
※2
パスワードをダブルクォーテーションで括った文字列を、UTF-16LEでエンコードしたものです。
[MS-ADTS]: unicodePwd | Microsoft Docs

実運用の場合でも、だいたいこれくらいの属性情報になるのではないかと思います。

そして、ユーザ追加のフォームですが
phpで以下のように書いてみました。
良かったら参考にしてみてください。

<?php

if(!empty($_POST['submit'])) {
  $ds = ldap_connect("ldaps://localhost");
  if($ds) {
      ldap_set_option($ds,LDAP_OPT_PROTOCOL_VERSION,3);
      $r = ldap_bind($ds,"cn=Administrator,cn=Users,dc=test,dc=local","ぱすわーど");
      $dn = "cn=" . $_POST['uid'] . ",cn=Users,dc=test,dc=local";
      $info["objectClass"][0] = "top";
      $info["objectClass"][1] = "person";
      $info["objectClass"][2] = "organizationalPerson";
      $info["objectClass"][3] = "user";
      $info["sn"] = $_POST['sn'];
      $info["cn"] = $_POST['uid'];
      $info["instanceType"] = "4";
      $info["objectCategory"] = "CN=Person,CN=Schema,CN=Configuration,DC=test,DC=local";
      $info["uid"] = $_POST['uid'];
      $info["displayName"] = $_POST['cn'];
      $info["sAMAccountName"] = $_POST['uid'];
      $info["userPrincipalName"] = $_POST['uid'] . "@test.local";
      $info["userAccountControl"] = "512";
      $info["distinguishedName"] = $dn;
      $info["homeDirectory"] = "/home/".$info["uid"];
      $info["loginShell"] = "/bin/bash";
      exec("ldapsearch -x -H ldaps://localhost -D cn=Administrator,cn=Users,dc=test,dc=local -w ぱすわーど -b cn=Users,dc=test,dc=local -LLL | grep uidNumber: | cut -f 2 -d ' ' | sort -nr | head -n 1",$uidNum,$res);
      $uid = ++$uidNum[0]; if($uid <= 1000) {
        $uid = 1001;
      }
      $info["uidNumber"] = $uid;
      $info["gidNumber"] = $uid;
      $info["unicodePwd"] = mb_convert_encoding("\"" . $_POST['password'] . "\"", "UTF-16LE");
      $r = ldap_add($ds,$dn,$info);
      if($r === FALSE) {
        echo "LDAPサーバへの登録に失敗しました<BR>";
      }
      else {
        echo "LDAPサーバへの登録完了しました<BR>";
      }
      ldap_close($ds);
  }
  else {
      echo "LDAPサーバへの接続に失敗しました";
  }
}

?>

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>ADアカウント登録</title>
</head>
<body>
  <h2>ADアカウント登録</h2>
  <form method="post" action="">
    <table>
      <tr>
        <th>社員番号</th>
        <td><input type="text" name="uid"></td>
      </tr>
      <tr>
        <th>Family Name</th>
        <td><input type="text" name="sn"></td>
      </tr>
      <tr>
        <th>Name(例:John Doe)</th>
        <td><input type="text" name="cn"></td>
      </tr>
      <tr>
        <th>Password</th>
        <td><input type="password" name="password"></td>
      </tr>
      <tr>
        <td><input type="submit" name="submit" value="送信"></td>
      </tr>
    </table>
  </form>
</body>
</html>

以上です。

ほかにも、ADからデータ取ってきてRADIUSに渡して無線LANの認証したり、
いろいろやったんですが

気が向いたら、鯖防人が忘れないように、書いておくかもしれません。



では。

OpenWrtとAmazon Dash Buttonでインターホン

こんにちは。機械音痴の鯖防人です。

8か月ぶりの更新です。ごめんなさい。
明日は雲仙に友達と遊びに行く予定です。たのしみ。



それでは本題。
Amazon Dash Buttonでインターホンを作ったので、今日はそのことについて書こうと思います。

はじめに

Amazon Dash Buttonをハックする記事などは結構インターネットの海を漂流しているので、紹介する必要は無いかと思います。
インターホン化する例としては
aokakes.hatenablog.com
こんなウェブページがあります。(孫引きよくない)

研究室にインターホンを「安価」に設置するため、Dash Buttonをインターホン化することにしました。

Dash ButtonをIoTボタンとして使うときに、多くの場合Raspberry Piなどを併用しますが
Raspberry Piを使うとなると1万円弱かかってしまうのではないかと思います。

また、今回Dash Buttonインターホンを研究室ネットワークとは別のネットワークにしたいと考えたため
ルータも必要となります。(Raspberry Piをルータにすることもできなくはないですが)

「ルータ」+「ラズパイの代わり(Dash Button監視機能)」+「無線LANアクセスポイント」
を1つの機器で実現しようといろいろ考えたところ
OpenWrtを使用するというアイデアに到達しました!

OpenWrtの説明ですが

The OpenWrt Project is a Linux operating system targeting embedded devices. Instead of trying to create a single, static firmware, OpenWrt provides a fully writable filesystem with package management. This frees you from the application selection and configuration provided by the vendor and allows you to customize the device through the use of packages to suit any application. For developers, OpenWrt is the framework to build an application without having to build a complete firmware around it; for users this means the ability for full customization, to use the device in ways never envisioned.

ということらしいです。
要は組み込み機器でLinuxが使えるよ!というやつです。
"OpenWrt"と書きます。"OpenWRT"ではないですね。
(業界には私みたいな()表記にうるさい人がいるので注意)

このOpenWrtはBuffalo等のルータにもインストールすることができ、Linuxが走る(!)より高機能なルータへと昇華させることができる素晴らしいものなのです。

ただ、ひとつ注意点なのが
日本では無線機器のファームウェアを書き換えると、機器の技適が無効となり電波法に抵触するので
アクセスポイントとして使う場合は、技適マークのついた無線LANモジュールを使う必要があります。

実装

今回、バッキャローBuffaloのWZR-HP-AG300Hを使いました。

AG300HにOpenWrtを流し込むやり方はインターネットでたくさん紹介されています。
zunnda00.blogspot.com

成功例が多く、情報も多いですし、中古は安いのでAG300Hを使うことをおすすめします。

OpenWrtの設定

OpenWrtはGUI(Web UI)とCUI(SSH)が使えます。

Web UIでできることはWeb UIでやって、できないことはCUIで。っていうのが私のスタンスです。

IPアドレスDHCPサーバ、無線LANの設定などはWeb UIでポチポチできます。

無線などの設定が終わったら今度はOpenWrtでDash Buttonのパケットを監視するための設定をしていきます。

まず必要なソフトをいれます。

リポジトリを参照させる必要があるので、/etc/opkg.confに

src/gz packages https://archive.openwrt.org/chaos_calmer/15.05.1/ar71xx/generic/packages

を追記します。(src/gzってのがよくわからない…)
URLは環境に合わせて変えてください。
d.hatena.ne.jp
[追記]
src/gzを追加後、

# opkg update

を実行してください。

OpenWrtはopkgというツールでパッケージを管理しているらしく、インストールはこれを使ってやっていきます。

# opkg install wget
# opkg install tcpdump

(たしかwgettcpdumpだけでよかったはず…)

今回、Dash ButtonのARP RequestパケットをOpenWrtのtcpdumpで監視します。

プログラム書くのが好きな人はプログラム書いてもいいと思いますが、
私はあまりプログラム得意ではないし、シェルで楽したい派なので今回はtcpdumpで。

tcpdumpを使う場合はこちらが参考になります。
moguno.hatenablog.jp

で、インターホンが押されたときに、今回はSlackに投稿することにしたので
SlackのIncoming WebHooksを使います。

Incoming WebHooksの導入は以下。
qiita.com

シェルスクリプト

いよいよ
シェルスクリプトを書きます。今回書いたのはこんな感じです。

#!/bin/ash

while true ; do
  tcpdump arp and ether src XX:XX:XX:XX:XX:XX -c 1 > /dev/null 2>&1  # XX:XX:XX:XX:XX:XXはDash ButtonのMACアドレス
  wget --post-data '{"text" : "来客のようですよ!"}' -O /dev/null WebHookのEndpoint
done

あとは実行権限付与して実行するだけです。

# chmod +x ./intercom.sh
# ./intercom.sh

・・・・・・・・・。

SSHから実行すると、SSH切断時にプロセスが落ちるのでnohup使わないとダメです…

…nohupを入れます。(オイ!💢 wgettcpdumpだけじゃないやんけ!💢💢)

# opkg install nohup

そして実行。

# nohup ./intercom.sh &

これでSSH切断しても実行されたままになります。

この状態でDash Buttonポチー!www
Slackに謎のincoming-webhookさんが叫んでくれます。
(名前やアイコンは変更可能です)

以上です。

おわりに

数時間の手抜き実装でしたが、いかがだったでしょうか。

研究室での設置がまだなので、はやく設置したいなーといったところです。


設置したものの、だれも押してくれない…ということがなければいいな………



読んでいただきありがとうございました。
では。

私が"AI"に忌避感を抱くワケ。

「でぃーぷらーにんぐでなんとかしてー」

こんにちは、機械音痴の鯖防人です。

私は専門家でもなんでもないですが、ちょっと最近気になってたので記事を書いてみます。
これはただの「つぶやき」ですので、不快に感じた方はそっ閉じしてください。
絶対につっかかってこないでください。
(ただのビビリ)
誤りのご指摘は歓迎致します。

いわゆる"AI"というものの中には、機械学習自然言語処理などさまざまな技術があります。
ここではそういった技術の説明は省かせていただきます。
表面的な内容ですので、ここでの説明は不要かと。

それでは本題。
皆さん、「AI」や「人工知能」と聞いてどのような印象を受けますか?
「すごそう」「なんでもできそう」って気になりませんか?(印象操作ではない)

少なくとも、技術的な知識がない一般の方はそう感じると思います。
これが、私がAIに対して忌避感・危機感を抱く理由です。

機械学習等の技術はまだまだ道半ばで、確立されたものではありません。
ましてや人間のように高度な思考が可能なものでもありません。

残念ながら、気軽に導入して適切に扱えるような代物ではないのです。


機械学習などに対して忌避感を抱いているということではありません。
技術自体は非常に魅力的で、適切に扱えば便利なものだと考えています。
人工知能」という言葉に対して忌避感を抱くのです。
それは、言葉だけが一人歩きしているのでは?と感じるからです。

世の中の過剰な意識が改善されること、機械学習等の技術がさらに発達することを
心から願っています。



短く雑な記事となってしまいましたが、この辺で。
では。

2段階認証の確認コードを紛失してニコニコ動画に入れなくなった話。

こんにちは。機械音痴の鯖防人です。

突然ですが
みなさん、ニコニコ動画を利用したことがありますか?
YouTubeと同様に、動画のアップロード・視聴(ニコニコ動画)とストリーミング配信(ニコニコ生放送)を提供しているサービスです。
なお、ニコニコ動画を利用するにはログインが必要となっています。
今回は、このニコニコ動画へのログインについて、私が体験したことをお話ししようと思います。

はじめに

ニコニコ動画にログインする際、メールアドレス(または電話番号(???))とパスワードが要求されます。
f:id:falcon_yuto:20180204150101p:plain
入力して[ログイン]をクリックすると、ログインが完了します。
一方、2段階認証を設定していると
[ログイン]をクリック後に確認コードを要求されます。

2段階認証とは

あなたのniconicoアカウントを不正ログインから守る設定の1つです。

2段階認証を有効にすると、パスワードの他、スマートフォンやメールアドレスでの確認によって、より安全にアカウントを保護できます。

2段階認証を有効にするとどうなるか
2段階認証を有効にするとログインするときにパスワードに加えて6桁の数字(確認コード)の入力が必要になります。

2段階認証とは | ニコニコヘルプ

とあるように、通常のパスワードに追加で、自動的に生成された確認コードが必要になります。

確認コードを取得する方法は2つあり、
・ニコニコから確認コードをメールで受け取る
Google Authenticator等のスマフォアプリから受け取る
のどちらかを選択することができます。
試しにメールでの受信をやってみました。
問題なくメールは届いたのですが、送信されたメールは暗号化されていませんでした。
つまり、可能性は低いと思われますが、悪意をもった第三者に確認コードが奪取される危険があると思われます。

次にもう一方の方法です。
スマフォアプリで確認コードを受け取る設定を行うと、アプリ上に6桁の数字が表示されます。
これは「ワンタイムパスワード(OTP)」といって、システムで自動的に生成される乱数を利用したパスワードです。
時刻同期型OTPなので、1分以上経過するとそのOTPは使用できなくなります。
通常はこちらを選択するのが良いでしょう。

私の体験談

やってしまった…

不正ログインの可能性を下げるため、2段階認証を設定していました。
先程紹介した方法で、Google Authenticatorアプリ経由で確認コードを取得していました。
しかしある時、その設定をしていたiPhoneが正常に動作しなくなりました。
iOSのバグが原因で、iPhoneを操作しているとロック画面に強制的にリダイレクトされるという不具合でした。
泣く泣くiPhoneをバックアップから復元しました。
FGOのデータはリストアできました(よかった!)が、Google Authenticatorの設定が消失してしまいました。
恥ずかしながら、バックアップコードの保存を忘れていたので、確認コードを入手する一切の方法がありませんでした。

サポセンへ…

どうすることもできないので、サポセンにフォームから問い合わせを行いました。
すぐに返信がありました。
本人確認のために「プレアカの決済番号を教えてくれ」と言われましたが見つからず…
結局は電話にてカード番号を伝えることで本人確認が完了しました。
2段階認証の設定を解除してもらい、無事にログインすることができました。

まとめ

今回は私の恥ずかしい体験をお話ししました。
この記事を通して、私がみなさんに伝えたいことは

  • 2段階認証を設定せよ
  • ただし確認コード(を生成するアプリ)を厳重に保管すべし
  • 特にバックアップコードの保管には十分注意せよ

ということです。
2段階認証は手軽に不正ログインの可能性を下げることができる便利な技術ですが
思わぬ落とし穴に注意が必要ですね。
ニコニコ以外のサービスでも2段階認証を利用しているので、注意していこうと思います。

では。

Honeypot運用にあたって初心者が最低限注意すべきことについて考える

この記事はHoneypot Advent Calendar 2017の18日目です。


こんにちは。機械音痴の鯖防人です。
今回は、Honeypot Advent Calendar 2017の記事として書いていきます。
ハニーポッターとしては1年生で、まだまだ知らないことだらけですが
枠が空いていたので、せっかくだから、ということで僭越ながら書かせていただきます。

続きを読む

phpとSHA-512とMariaDBでSMTP認証

こんにちは。機械音痴の鯖防人。です。
今回はCyber研究会でサーバ構築の作業をしててわかったことを備忘録として書いておきます。

みなさんはPostfixDovecot使ってメールサーバ立ててますよね?
もちろん第三者にメールサーバを悪用(いわゆる踏み台に)されないようにSMTP認証をしていますよね?

Cyber研究会のメールサーバをPostfixDovecotで立てました。
(ふつうはPostfixAdminとか使うのだと思いますが)
私はphpからメールアドレスをデータベース(MariaDB)に登録したかったので
MariaDBのデータをSMTP認証の認証情報としてDovecotさんに利用してもらう、みたいな形を取りました。
参考にしたのは以下のサイトです。ありがとうございます。
CentOS7でPostfix + Dovecot + MariaDB(MySQL)でバーチャルメールボックスを利用してメールを送受信する (1) - Postfix の設定 | Postfix Tips & FAQ
[Linux] CentOS7 で Postfix + Dovecot + MariaDBでバーチャルメールボックスを利用してメールを送受信する (2) - dovecot の設定
下のSQL文でメールアカウント(メールアドレス)をデータベースに登録します。
  INSERT INTO users (email,password) VALUES('[作成するメールアドレス]', ENCRYPT('[パスワード]'));
入力されたパスワードをENCRYPT( )で暗号化しています。
このENCRYPT( )はUNIX/LinuxのCRYPT( )を使って暗号化しているようです。
でもこのCRYPT( )がいまいちわからない… DESで暗号化してるっぽいですが…
今回はDESを使わずSHA-512を使うことにしました。

まずDovecotの設定。

# vi /etc/dovecot/dovecot-sql.conf.ext

- default_pass_scheme = CRYPT
+ default_pass_scheme = SHA512-CRYPT

今回はSHA-512を使いましたが、他にもいろいろあります。
詳しくはDovecotのドキュメント
Authentication/PasswordSchemes - Dovecot Wiki
を見てください。
※間違ってもSHA-1MD5などを使わないように。
終わったらDovecotを再起動しておきましょう。

次にphp
phpのほとんどをCyber研究会の他のメンバーにかいてもらったので
私はINSERT文の部分だけ修正しました。
[追記]
今回は$_POST['email']の中身を検査して適切なものが入力されている前提でqueryを使用しています。
ですが、最低限のSQLインジェクション対策としてきちんとPDOのprepareを使用するべきでしょう。

<?php
//------省略------
$password = $_POST['password'];
$salt = substr(sha1(rand()), 0, 16);
$hashed = "{SHA512-CRYPT}" . crypt($password, "$6$$salt");
//------省略------
$sql = "INSERT INTO users(email,password) VALUES(\"" . $_POST['email'] . "\",\"" . $hashed . "\")";
$result = $pdo -> query($sql);
//------省略------
?>

みたいな感じです。
phpは下のサイトまんまです。ありがとうございます。
mad9scientist.com

以上です。
これでメールサーバの本格運用が始められます。

読んでいただきありがとうございました。
間違い等ありましたらご指摘いただければ嬉しいです。
それと、忙しいのにphpを書いてくれたCyber研究会のNくん、ありがとうございました。
忙しいのは私も同じなので、どうぞご安心を。


それでは。