Amazon LinuxにハニーポットCowrieを入れてみる
はじめに
最近suzuki.sh に刺激されたのもあり, 2013年からhatena diaryの更新が完全停止していたが, hatena blog にインポートをして再度開始してみることに. 今年の夏/冬と"とあるイベント"があり, そこでSSHハニーポットを入れて遊ぶことがあったので, それの備忘録をここで残してみます. ただその時は, kippoを利用して構築したので, 今回は前々から気になっていたCowrieを利用する.
ハニーポットってなに?
元来は「蜜(の詰まった)壷」の意味で、何らかの有益そうな情報や資源がありそうな場所を用意して、それにつられた者を観察したり、肝心な部分で被害を出さないために目をそらせたり、コンピュータ・フォレンジックスを行うための証拠を集めたりする、一種のおとり手法に使われる。 手法そのものをハニーポットと呼ぶこともある。
ハニーポット - Wikipediaからの引用によると上記のように示されている.
ここではsshハニーポットを利用するので, 通常22番ポートでsshdがListenしているが, そこを全く別のモノに置き換えてしまい, ダミーのsshdで受け付けてしまおうという事である.
今回目指す構成
上にも書いたが, 22番ポートでListenしたい. ただ Cowrieを起動するにはrootユーザではなく一般ユーザにしたいので, その場合は通常だと1024番ポート未満ではListen出来なくなる.
なので今回はiptablesのNATテーブルを利用して, 22番ポートに来たリクエストを CowrieのListenポートにリダイレクトする事にした.
まとめるとこんな感じ
- sshdのポートは22番から2754番に変更
- Cowrieは2222番ポートでListenさせる
- iptablesのNATを利用して, 22番ポートへのアクセスを2222番ポートにリダイレクトさせる
まずはインストール
必要なパッケージをインストールする
必要なパッケージは以下に記載されている
cowrie/requirements.txt at master · micheloosterhof/cowrie · GitHub
$ sudo yum -y install gcc git python-setuptools python-devel python-crypto libffi-devel openssl-devel gmp-devel $ sudo easy_install pip $ sudo easy_install PyCrypto pyasn1 $ sudo pip install twisted==15.2.1 cryptography configparser pyopenssl tftpy
※ twistedのバージョンが 15.3以上の場合, 起動しなかったためバージョンを15.2.1に指定しています.
Cowrieの起動用アカウントの作成
$ sudo adduser cowrie
ここから先は cowrieユーザにswitchして作業をしていきます.
$ sudo su - cowrie
Cowrieのダウンロードと設定
$ git clone http://github.com/micheloosterhof/cowrie $ cd cowrie/ $ cp cowrie.cfg.dist cowrie.cfg
今回は設定はデフォルトのままでいきます. listenポートを変更したり, ホスト名を変更したい場合はここを適宜触ってください.
ダミーユーザの追加
以下のファイルを編集/追加することで, ダミーユーザの作成ができます.
今回はこのまま利用するので, rootのパスワードは!rootです.
$ cat data/userdb.txt root:x:!root root:x:!123456 root:x:* richard:x:* richard:x:fout
Cowrie を起動する
$ ~/cowrie/start.sh
このままだと, 2222番ポートでListenしているだけですが, 以下のように接続をしてテストをしてみます.
$ ssh root@localhost -p 2222 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. root@svr04:~#
こんな風に返ってきたらOKです.
Cowrieを停止したい場合は以下のコマンドで停止することができます.
$ ~/cowrie/stop.sh
ポート番号を変更していく
ここからは適宜rootで実行していくので sudoを利用しています.
sshdのポート番号を変更
$ sudo vi /etc/ssh/sshd_config
# If you want to change the port on a SELinux system, you have to tell # SELinux about this change. # semanage port -a -t ssh_port_t -p tcp #PORTNUMBER # # Port 22 Port 2754 <- ここを追加
変更をしたら設定を再読込させます.
$ sudo service sshd reload
iptablesの設定
必要最低限の設定だけをここではします.
sudo vim /etc/sysconfig/iptables
*nat :PREROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] -A PREROUTING -p tcp --dport 22 -j REDIRECT --to-port 2222 COMMIT *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] # filter settings here... COMMIT
$ sudo service iptables start
これで 22番ポートで ssh接続をすると 2222番ポートに転送されるようになりましたね.
ログの出力と確認
リアルタイムに見たい場合はこんな感じで.
$ tail -f ~/cowrie/log/cowrie.log
セッションごとにどんなコマンドが実行されたのかを見る場合は, 以下のコマンドでみれます.
$ ~/cowrie/bin/playlog ~/cowrie/log/tty/YYYYDDMM-AAAAAA-BBBBBBB-xx.log
このコマンドを実行すると, そのセッションでの出来事を再現してくれるので面白いですね.
まとめ
今回は遊び用で入れたものを書いているので, これをそのまま実運用に使わないでください.
マジメにやる場合は, CowrieよりもT-Pot: A Multi-Honeypot Platformのほうが可視化もされて良さそうですね.
3年半ぶりともなると, なかなか投稿が進みませんでしたが, SAOのサウンドトラックのお陰で最後まで書ききる事ができました.
Ruby2.0.0 を CentOS6.4, OS X に 入れてみる
仕事ではここ数年ずっとPHPなので, プライベートではRubyにしようと.
PHPは別に嫌いじゃないですが, Rubyは書いてて気持ちがいいですね.
ということで, そろそろ2.0に移行しようと思って, 久々に環境構築をしたのでその備忘録です.
1. 前提条件
2. rbenv + ruby-build + ruby のインストール
OS X (Mountain Lion) の場合
(1) rbenv + ruby-build
$ brew update $ brew upgrade $ brew install rbenv ruby-build $ cat << EOF >> ~/.zshrc export PATH="$HOME/.rbenv/bin:$PATH" eval "$(rbenv init -)" EOF $ source ~/.zshrc
(2) ruby を入れるのに必要なパッケージをインストール
$ brew install openssl $ brew link openssl --force $ brew install readline $ brew link readline --force $ brew install libyaml $ brew link libyaml --force
- --force を付けないと warning が出たのでつけています
(3) ruby 2.0 を インストール
$ ruby-build --definitions : : 1.9.3-rc1 2.0.0-p195 2.1.0-dev : : $ CONFIGURE_OPTS="--with-opt-dir=/usr/local/" rbenv install 2.0.0-p195 $ rbenv rehash $ rbenv versions * system (set by /Users/kopug/.rbenv/version) 2.0.0-p195 $ rbenv global 2.0.0-p195 $ ruby -v ruby 2.0.0p195 (2013-05-14 revision 40734) [x86_64-darwin12.3.0]
CentOS 6.4 の場合
(1) yum で 依存パッケージをインストール
$ sudo yum -y install git zlib zlib-devel readline readline-devel openssl openssl-devel curl curl-devel
(2) rbenv + ruby-build
# cd /usr/local # git clone git://github.com/sstephenson/rbenv.git rbenv # git clone https://github.com/sstephenson/ruby-build.git rbenv/plugins/ruby-build
# cat << EOF >> /etc/profile.d/rbenv.sh export RBENV_ROOT="/usr/local/rbenv" export PATH="/usr/local/rbenv/bin:$PATH" eval "$(rbenv init -)" EOF
# source /etc/profile.d/rbenv.sh
(3) ruby 2.0 を インストール
# rbenv install --list : : 1.9.3-rc1 2.0.0-p353 2.1.0-dev : : # rbenv install 2.0.0-p353 # rbenv rehash # rbenv versions * 2.0.0-p353 (set by /usr/local/rbenv/version) $ rbenv global 2.0.0-p353 $ ruby -v ruby 2.0.0-p353 (2013-05-14 revision 40734) [x86_64-linux]
3. Bundler の インストール
※ ~/.gemrc にある "custom_shebang directive" を削除してから以下を実行すること(途中でエラーになるため)
$ rbenv exec gem update --system $ rbenv exec gem install bundler $ rbenv exec gem install rbenv-rehash $ rbenv exec gem list *** LOCAL GEMS *** bigdecimal (1.2.0) bundler (1.3.5) io-console (0.4.2) json (1.7.7) minitest (4.3.2) psych (2.0.0) rake (0.9.6) rdoc (4.0.0) test-unit (2.0.0.0) $ rbenv exec gem which bundler /Users/kopug/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/bundler-1.3.5/lib/bundler.rb
4. Railsのローカルインストール及びプロジェクト作成
$ cd ~/Work/projects $ cat << EOF > Gemfile source "http://rubygems.org" gem "rails", "バージョン(省略可能. その場合は最新版)" EOF
一時的にrailsプロジェクトを作成するために --path で指定した箇所に railsで必要なgemをインストール
$ bundle install --path vendor/bundle $ bundle list
プロジェクト名は example(適当), --skip-bundle を指定しておかないと, project作成時に勝手に bundle install が走って, global 環境にgemがインストールされてしまう
$ bundle exec rails new example --skip-bundle
プロジェクトが作成できたら, 以下は不要なので削除
$ rm -rf Gemfile Gemfile.lock .bundle vendor
ここでプロジェクトに必要なgem をプロジェクト配下にインストールをする
$ cd example/ $ bundle install --path vendor/bundle
git の管理からgemを外す
$ echo '/vendor/bundle' >> .gitignore
Rails Server 起動
$ bundle exec rails server
Ruby on Rails(RoR) 開発環境を構築する
久々の更新です。(毎回言っているが…^_^;)
Railsの開発環境を急遽構築したという事もあり, 備忘録がてらに残します.
1. 最新のパッケージに更新をする
$ sudo yum -y update
2. 必要なパッケージをインストールしておきます
$ sudo yum -y install gcc kernel-devel zlib-devel openssl-devel readline-devel curl-devel libyaml-devel sqlite-devel
3. Rubyのインストールをする
普段ならrpmでインストールをしようとするのですが, ebenvを使ってrubyのバージョン(環境)管理をします.
$ sudo git clone git://github.com/sstephenson/rbenv.git /usr/local/share/rbenv $ vi /etc/profile.d/rbenv.sh
export PATH="/usr/local/share/rbenv/bin:$PATH" export RBENV_VERSION="1.9.3-p327" export RBENV_DIR=/usr/local/share/rbenv export RBENV_ROOT=/usr/local/share/rbenv eval "$(rbenv init -)"
$ source /etc/profile.d/rbenv.sh
zsh を使っていると /etc/profile.d 配下を読み込まないので,以下を /etc/zprofileに追加
for i in /etc/profile.d/*.sh ; do [ -r $i ] && source $i done
ruby-build をインストールして, rubyをいれる
$ sudo git clone git://github.com/sstephenson/ruby-build.git /usr/local/src/ruby-build $ cd /usr/local/src/ruby-build $ sudo ./install.sh
rubyをインストール
$ sudo rbenv install 1.9.3-p327 $ sudo rbenv rehash $ sudo rbenv global 1.9.3-p327 $ sudo gem install bundler
$ sudo gem install rails unicorn
1. さくらVPS CentOS6.2で基本設定をする
久々の更新です。
最近サーバ構築するのもスクリプトを流して終了…というのが多かったですが、久々に手動で構築したので備忘録として残します。
2. etckeeper を入れて /etc配下をgitで管理
epel リポジトリが初めから入っていたのですんなり入った。
# yum -y install etckeeper # etckeeper init
3. 作業用ユーザの作成
rootで毎回作業するのは怖いので、作業用のユーザを作成して sudo権限を付けておく
# adduser kopug # passwd kopug # usermod -G wheel kopug
# visudo
# 以下のコメントを外す ## Allows people in group wheel to run all commands %wheel ALL=(ALL) ALL
作業用ユーザのSSH公開鍵を置いておく
※ ここからは作業用ユーザで繋ぎ直してから作業を行う
4. SSHの設定
4-1) デフォルトのポート番号を変更
$ sudo sed -i 's/^#Port 22/Port 10022/' /etc/ssh/sshd_config
4-2) rootでの接続をNG
$ sudo sh -c 'echo "PermitRootLogin no" >> /etc/ssh/sshd_config'
4-3) パスワードなしでのログインNG
$ sudo sh -c 'echo "PermitEmptyPasswords no" >> /etc/ssh/sshd_config'
4-4) 鍵認証必須
$ sudo sed -i 's/^PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
4-5) 設定反映
$ sudo /sbin/service sshd restart
※ ~/.ssh/authorized_keys に公開鍵を設定しておくこと
5. iptablesの設定
管理用のポートと, sshとweb以外は閉じておく
# /etc/sysconfig/iptables *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :RH-Firewall-1-INPUT - [0:0] -A INPUT -j RH-Firewall-1-INPUT -A FORWARD -j RH-Firewall-1-INPUT -A RH-Firewall-1-INPUT -i lo -j ACCEPT -A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT -A RH-Firewall-1-INPUT -p 50 -j ACCEPT -A RH-Firewall-1-INPUT -p 51 -j ACCEPT -A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT -A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT -A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # SSH, HTTP -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10022 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited COMMIT
あとはiptablesを再起動させ、デフォルト起動するようにしておく。
$ sudo /sbin/service iptables restart $ sudo /sbin/chkconfig iptables on
6. root宛のメールを受け取るようにする
メールアドレスの部分は置き換えてください(^_^;
$ sudo sudo sed -i '/^root:/d' /etc/aliases $ sudo sh -c "echo 'root: user@example.com' >> /etc/aliases" $ sudo newaliases
6. パッケージを最新版にする
$ sudo yum upgrade -y
7. etckeeper でcommitをしてサーバを再起動
$ sudo etckeeper commit $ sudo reboot
さくらVPSのカスタムOSインストールでUbuntuを入れてみる #1
今までCentOSを使っていたけど、2011年からはUbuntuを使うことにする。
※ Mac OS X(10.6.6)のChrome(8.0.552.237)を使ってインストールをしようとしたところ、
VNCコンソールが正常に起動しなかったため、Firefox(3.6.13)を使用しました。(´・ω・`)
さくらインターネットVPSのコントロールパネルより、
OS再インストール > カスタムOSインストールへ のリンクを押下する。
1. この画面でOSの選択が可能になるので、ここでは"Ubuntu 10.04 amd64"を選択し、確認ボタンを押下
2. IPアドレス等の情報がでてくるので閉じないようにし、VNCコンソールを起動する
3. 以下のマニュアルを参考にしながらインストールを行う
カスタムOSインストールガイド : Ubuntu 10.04
4. インストールが完了したら、コントロールパネルよりサーバを起動させ、Ubuntuのバージョンを10.10にアップグレードする
$ sudo sed -i 's/^Prompt=lts/Prompt=normal/g' /etc/update-manager/release-upgrades $ sudo do-release-upgrade $ sudo reboot
$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 10.10 Release: 10.10 Codename: maverick
5. バージョンが10.10 になっているのを確認したら、パッケージのフルアップデートをします。
$ sudo aptitude full-upgrade $ sudo aptitude install build-essential
$ sudo locale-gen ja_JP.UTF-8 $ sudo /usr/sbin/update-locale LANG=ja_JP.UTF-8
7. sshの設定
$ mkdir ~/.ssh $ vi ~/.ssh/authorized_keys "自分の公開鍵を貼り付ける" $ chmod 600 ~/.ssh/authorized_keys $ chmod 700 ~/.ssh
$ sudo vi /etc/ssh/sshd_config
Port 22** PermitRootLogin no PasswordAuthentication no
$ sudo /etc/init.d/ssh restart
8. 適当に見繕ってパッケージをインストールする
$ sudo aptitude install zsh git-core git-svn subversion vim screen
9. iptables の設定
$ sudo ufw allow 22** <- ssh port $ sudo ufw allow 80 $ sudo ufw default deny $ sudo ufw enable $ sudo iptables -L <- ポリシーの確認
10. shellの変更
$ chsh -s /usr/bin/zsh
後は自分の好みで、.screenrc .vimrc .zshrc を配備する感じ。
参考
symfony で普段使っているpluginをまとめてみた
この記事はSymfonyアドベントカレンダー2010の19日目です
1. sfWebBrowserPlugin - RESTful APIを利用するならお手の物。HTTP通信なら完全お任せ!
READMEを見ると利用方法が事細かに書かれているので非常に分かりやすいですね。
このpluginでは 3種類のインターフェイスをアダプターという形で用意しています。
- sfCurlAdapter
- sfFopenAdapter
- sfSocketsAdapter
どれを利用しても良いのですが、Forward Proxy経由でHTTPリクエストを送りたい事があるため、sfCurlAdapterを利用しています。
(例)
<?php $b = new sfWebBrowser(array(), 'sfCurlAdapter', array('httpproxytunnel' => 1, 'proxy' => 'http://proxy.example.com:8080', 'proxyport' => '8080', ) );
クラウド環境を利用していて、webサーバがオートスケールで増えてくれるのはいいけれども、振られるグローバルIPが何になるのか分からない場合などに使えますね!
※1. IPアドレスでの通信制限が無い場合は、気にする必要はないです。
※2. ロードバランサーがNATしてくれている場合は、気にしなくてもOK
2. sfDoctrineMasterSlavePlugin - DBのReplicationをするならまずこれでしょう!
Symfonyアドベントカレンダー2010の12日目にvectorxenonさんがsfDoctrineMasterSlavePluginの事を書かれております。
このpluginで何が1番嬉しかったかというと、マスターの分散が出来ることです。
# databases.yml all: # db1 connections db1_master: class: sfDoctrineDatabase param: dsn: mysql:dbname=db1;host:db1-master.example.com username: root password: ~ group: db1 db1_slave: class: sfDoctrineDatabase param: dsn: mysql:dbname=db1;host:db1-slave.example.com username: root password: ~ group: db1 # db2 connections db2_master: class: sfDoctrineDatabase param: dsn: mysql:dbname=db2;host:db2-master.example.com username: root password: ~ group: db2 db2_slave: class: sfDoctrineDatabase param: dsn: mysql:dbname=db2;host:db2-slave.example.com username: root password: ~ group: db2
selectの負荷はSlaveサーバを増やすことによって解決できますが、
更新系処理が多くなってくる場合、それでは対応できません。
上記のようにMaster and Slaveサーバのグループを用意し、schema.ymlで対応するconnectionを指定すればOKです。
# schema.yml User: connection:db1 columns: name: { type: string(255), notnull: true } LegacyUser: connection:db2 columns: name: { type: string(255), notnull: true }
3. sfAdminDashPlugin - 手軽にシャレオツ管理画面を提供したい場合に!
README に設定方法が書かれていますが、id:ken39argさんがsfAdminDashPluginがかなりいい件についてという記事で、ハマりどころも合わせて書かれています。
WEBサービスを作る上で管理画面って結構後回しにされがちですが、このpluginで手軽にシャレオツな管理画面が作れるので重宝しています。
4. sfTaskExtraPlugin - pluginを簡単に作るためのplugin
symfonyで幾つかProjectの開発をしていくと、必ずProject間で共通で利用したいコードが出てくると思います。
その時にplugin化をしたくなるのですが、pluginを開発する上で簡単で手軽にテストコードも準備できる枠組みを提供してくれるのがsfTaskExtraPluginです!
まずインストール
$ symfony plugin:install sfTaskExtraPlugin
これでREADMEに書かれているタスクを利用する事ができるようになりますが、特によく使うのは以下です。
- generate:plugin: pluginのスケルトンを吐き出す
- generate:plugin-module: モジュールを含むpluginのスケルトンを吐き出す
- plugin:package: 作成したpluginをPEARパッケージにしてくれます
symfony の pluginはPEARパッケージで管理しているので、これを使うといちいちpaclage.xmlを作成する必要がなくなります。
まぁそれも便利なのですが、一番素晴らしいのがTDDでの開発がすごくしやすくなることです。
実際にmyPluginを作成してみます。
$ symfony generate:plugin myPlugin
これだけで以下のスケルトンができます。
plugins/myPlugin |-- LICENSE |-- README |-- config | `-- myPluginConfiguration.class.php |-- lib |-- package.xml.tmpl `-- test |-- bin | `-- prove.php |-- bootstrap | |-- functional.php | `-- unit.php |-- fixtures | `-- project | |-- apps | | `-- frontend | | |-- config | | | |-- app.yml | | | |-- cache.yml | | | |-- factories.yml | | | |-- filters.yml | | | |-- frontendConfiguration.class.php | | | |-- routing.yml | | | |-- security.yml | | | |-- settings.yml | | | `-- view.yml | | |-- i18n | | |-- lib | | | `-- myUser.class.php | | |-- modules | | `-- templates | | `-- layout.php | |-- cache | |-- config | | |-- ProjectConfiguration.class.php | | |-- properties.ini | | `-- rsync_exclude.txt | |-- data | | `-- fixtures | | `-- fixtures.yml | |-- lib | | `-- form | | `-- BaseForm.class.php | |-- log | |-- plugins | |-- symfony | |-- test | | |-- bootstrap | | | |-- functional.php | | | `-- unit.php | | |-- functional | | `-- unit | `-- web | |-- css | | `-- main.css | |-- images | |-- js | |-- robots.txt | `-- uploads | `-- assets |-- functional `-- unit
上記を見てわかるとおり、殆どがテストのためのディレクトリ、ファイルになります。
※ plugin:packageをすると上記のテストディレクトリは除外されてパッケージされます。
テストコードの書き方は以下のドキュメントに詳しく書かれていますので、これでいつでもplugin開発ができますね!
5. sfMobileJPlugin - ガラケー対応サイトを作るのなら・・
手前味噌で恐縮ですが、仕事柄ガラケーのサイトを開発することがあるので、ガラケーに特化したpluginを公開しております。
使い方はREADMEにも書いていますが、簡単にご紹介すると、現在公開しているバージョンで出来ることは以下の2つです。
- 通常のテンプレートとガラケー共通テンプレートを分けることが可能
- 個体識別番(imodeID, UID and EZ番号)の制御
- ページ全体、個別でUIDの通知条件の必須を選択することが可能
はい。それだけです。(ぉぃ)
一応それ以外にも細かなUtil classもあったりしますが、backendではNet_UserAgent_Mobileを使用しているので、端末の情報取得系はそちらが使えます。
現在公開準備中ではありますが、絵文字処理、携帯メール処理も上記pluginに含めれるようにコツコツと開発をしております。(^_^;