Firewalldで特定IPからの接続をdrop

このサイトは見ての通りwordpressなのですが、wordpressではloginのurlが推測されやすいために結構攻撃を受けます。
私程度のサイトでも結構な頻度で攻撃されます。
Limit Login Attemptというプラグインを利用していると、攻撃をしかけてきているIPとその際にアクセスしようとしたログインIDがわかるのですが、久しぶりにみたら結構すごかったです。
やっぱログインのURL変えなきゃダメですね。

今回は攻撃元IPを全て遮断(drop)してみようと思います。

LimitLoginAttemptから一覧取得

お題目つけるほどでもないのですが、管理画面のプラグインページから
IP ID
の組み合わせを全部コピーしてきます。
それをサーバ上に配置したら準備完了です。

[root@metal ~]# vi limitLoginAttempt.txt  

awkでコマンド作成

awkコマンドでIPを取得しつつ、firewall-cmdのコマンドを作成していきます。
私実は初めて自分でawk使いました。
便利ですね〜。

[root@metal ~]# cat limitLoginAttempt.txt | awk '{print "firewall-cmd --add-source=" $1 " --permanent --zone=drop"}' > drop_ip.sh  

もっとかっこいい書き方があるのかもしれませんが、これで十分。
これにてコマンドが作成できました。
あとはこれをshell scriptにして実行するだけです。

シェルによるIPのdrop

続いて先ほどのファイルをshell scriptにして実行です。

# 先頭に #!/bin/sh を追加  
[root@metal ~]# vi drop_ip.sh  
[root@metal ~]# chmod 700 drop_ip.sh   
[root@metal ~]# ./drop_ip.sh  
[root@metal ~]# firewall-cmd --reload  
success  
[root@metal ~]# firewall-cmd --list-all --zone=drop  
  
# 後片付け  
[root@metal ~]# rm drop_ip.sh limitLoginAttempt.txt   
rm: remove regular file ‘drop_ip.sh’? y  
rm: remove regular file ‘limitLoginAttempt.txt’? y  

これにて完了です。
しばらくは標準出力としてコンソールにsuccessがたくさんでてきます。
あとは永続指定をしているのでfirewallをリロードしつつ、設定を確認しています。

これで少しは安心できますが、必ずしも固定IPの場所から攻撃されているわけでもないでしょうから巻き添えを食らっている人もいるかもしれません。
でもどうせ韓国とかロシアだろうから、気にしません。

あとがき

昨日なんの気なしに見たら、IDの場所に正しいIDが指定されていて肝が冷えました。
httpsなのになぜバレているんでしょうね。

わりとほんとわからないです。

RedmineからsSMTPでメールを送信

Redmineの管理画面にアクセスしたところメール通知設定は所定のファイルを編集しないとできないようでした。
今回はsSMTPを利用してメール通知を行ってみます。

configuration.yml作成

Redmineのメール設定はconfiguration.ymlに記載します。
今回はsSMTPを利用するので、そのために設定を行います。

root@raspberrypi:~# cp /var/www/public/redmine/config/configuration.yml.example /var/www/public/redmine/config/configuration.yml  
root@raspberrypi:~# vi /var/www/public/redmine/config/configuration.yml  
# 以下を追加  
  email_delivery:  
      delivery_method: :sendmail  
      sendmail_settings:  
        arguments: '-i'  
  
root@raspberrypi:~# systemctl restart apache2  

configuration.ymlにはdefault, production, development、それぞれの設定を記載するためのセクションがあります。
今回はdefaultに設定していますが、開発時と実運用時で分けたい場合にはここに分けて記載するというわけですね。

ssmtpの設定ではdelivery_methodがsendmailになります。
通常ではこの部分がsmtpになります。

また私はRoRの開発経験が地味にないのでキャッシュなのかそういうものなのかはわかりませんが、apacheの再起動をしないと設定が反映されませんでした。

これにて設定は完了です。

あとがき

今回mailのfromがredmine側で設定しているものと違うものになっていました。
これはssmtpを利用する弊害なのか、設定が足りてないかは謎です。
argumentsの部分を無理やり設定したらできそうではありますが、今のところはメールが届けばそれでいいので気にしていません。

そもそもこのredmineは家庭内で閉じているのでそもそもメール通知要らないんですけどね。
期限切れチケットがあるときにメール送るような設定ができるかどうか調べようと思います。
そこに水道代とかの支払いを設定して、忘れないようにしたいところです。

RaspbianにRedmine3を導入

普段Zabbixを入れて運用しいてるRaspbianにRedmineも入れてみました。
ややスペック不足になるかもしれないなと感じながら、まぁ使えると言っていいレベルには動いています。

Rubyのインストール

Raspianではデフォルトでruby1.9あたりがインストールされていますが、せっかくなので最新のrubyを入れてみます。
元々スペックも低いのでできるだけ最新のrubyを入れたいですよね。

もはやおなじみですがrbenvを導入します。
またRubyのインストールにはそれなりに時間がかかります。CPUにはヒートシンクをつけていますが、それでも45℃くらいまで温度が上がっていたので室温は多少気にした方がいいかもしれません。

root@raspberrypi:~# aptitude install git libssl-dev libreadline-dev  
root@raspberrypi:~# git clone https://github.com/sstephenson/rbenv.git /usr/local/rbenv  
...  
Checking connectivity... done.  
root@raspberrypi:~# git clone https://github.com/sstephenson/ruby-build.git /usr/local/rbenv/plugins/ruby-build  
...  
Checking connectivity... done.  
root@raspberrypi:~# vi /etc/profile.d/rbenv.sh  
root@raspberrypi:~# cat /etc/profile.d/rbenv.sh   
export RBENV_ROOT="/usr/local/rbenv"  
export PATH="${RBENV_ROOT}/bin:${PATH}"  
eval "$(rbenv init -)"  
  
# shell再読み込み  
root@raspberrypi:~# exec $SHELL -l  
root@raspberrypi:~# rbenv install --list  
root@raspberrypi:~# CONFIGURE_OPTS="--disable-install-doc" rbenv install 2.2.3  
root@raspberrypi:~# rbenv versions  
* system (set by /usr/local/rbenv/version)  
  2.2.3  
root@raspberrypi:~# rbenv global 2.2.3  
root@raspberrypi:~# ruby -v  
ruby 2.2.3p173 (2015-08-18 revision 51636) [armv7l-linux-eabihf]  
root@raspberrypi:~# vi ~/.gemrc  
root@raspberrypi:~# cat ~/.gemrc   
gem: --no-rdoc --no-ri  

rbenvのlistで確認したところ、今の最新が2.2.3だったのでそれを導入しました。
redmineが導入できないと困るので一応確認はしていますが、2.2系でも問題なく動くようです。

Redmineの導入

続いてRedmineを導入していきます。
apt-get系のパッケージにはredmineが入っているらしいので、apt-get install redmineでも導入できるみたいですが、なんか嫌なのでwgetで取得しています。

例によってbundle installには結構時間がかかります。

# 必要なパッケージインストール  
root@raspberrypi:~# aptitude install imagemagick libmagick++-dev libmysqld-dev  
root@raspberrypi:~# cd /var/www/public  
root@raspberrypi:/var/www/public# wget http://www.redmine.org/releases/redmine-3.1.1.tar.gz  
root@raspberrypi:/var/www/public# tar zxvf redmine-3.1.1.tar.gz  
root@raspberrypi:/var/www/public# cd redmine-3.1.1  
  
# DB作成  
root@raspberrypi:/var/www/public/redmine-3.1.1# mysql -u root -p  
mysql> CREATE DATABASE redmine CHARACTER SET utf8;  
mysql> CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'N)VMD8ykhrdT';  
mysql> GRANT ALL PRIVILEGES ON redmine.* TO 'redmine'@'localhost';  
mysql> quit  
Bye  
  
# DB接続設定を記載  
root@raspberrypi:/var/www/public/redmine-3.1.1#cp config/database.yml.example config/database.yml  
root@raspberrypi:/var/www/public/redmine-3.1.1# vi config/database.yml  
root@raspberrypi:/var/www/public/redmine-3.1.1# diff config/database.yml.example config/database.yml  
9,10c9,10  
<   username: root  
<   password: ""  
---  
>   username: hogehoge  
>   password: "fugafuga"  
root@raspberrypi:/var/www/public/redmine-3.1.1# gem install bundler  
root@raspberrypi:/var/www/public/redmine-3.1.1# bundle install --without development test  
root@raspberrypi:/var/www/public/redmine-3.1.1# rake generate_secret_token  
/usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/htmlentities-4.3.1/lib/htmlentities/mappings/expanded.rb:465: warning: duplicated key at line 466 ignored: "inodot"  
root@raspberrypi:/var/www/public/redmine# RAILS_ENV=production rake db:migrate  

ここまでを行うことで、一旦Redmineのインストールまでは完了です。
Railsのインストールはbundle installの場所で行われているということですね。

Passengerインストール

次はApacheを介してRedmineへ接続するためにpassengerを導入します。
これもいくつか導入方法があるようですが、いつもやり方で行っていきたいと思います。

またこちらも同じく時間がかかります。

root@raspberrypi:/var/www/public/redmine-3.1.1# gem install passenger --no-rdoc --no-ri  
# passengerの導入に必要なパッケージインストール  
root@raspberrypi:/var/www/public/redmine-3.1.1# aptitude install install -y libcurl4-openssl-dev apache2-threaded-dev libapr1-dev libaprutil1-dev  
root@raspberrypi:/var/www/public/redmine-3.1.1# passenger-install-apache2-module  
Use <space> to select.  
If the menu doesn't display correctly, press '!'  
  
   ⬢  Ruby  
 ‣ ⬡  Python  
   ⬡  Node.js  
   ⬡  Meteor  
(省略)  
Phusion Passenger is a registered trademark of Hongli Lai & Ninh Bui.  

途中で、「Please edit your Apache configuration file, and add these lines:」この出力とともに今後利用する設定ファイルへの記述内容が表示されるのでコピーしておきましょう。

今回はRuby以外を導入するつもりもないのでPythonのチェックを外しました。

Apache サイト設定追加

最後に公開するためにapacheに設定を追加します。

root@raspberrypi:~# chown -R www-data:www-data /var/www/public  
root@raspberrypi:~# ln -s /var/www/public/redmine-3.1.1 /var/www/public/redmine  
# passenger用設定を追加  
root@raspberrypi:~# vi /etc/apache2/conf-available/passenger.conf  
root@raspberrypi:~# cat /etc/apache2/conf-available/passenger.conf  
LoadModule passenger_module /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/passenger-5.0.21/buildout/apache2/mod_passenger.so  
<IfModule mod_passenger.c>  
  PassengerRoot /usr/local/rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/passenger-5.0.21  
  PassengerDefaultRuby /usr/local/rbenv/versions/2.2.3/bin/ruby  
</IfModule>  
  
# redmine用バーチャルホスト設定追加  
root@raspberrypi:~# cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/redmine.conf  
root@raspberrypi:~# vi /etc/apache2/sites-available/redmine.conf   
root@raspberrypi:~# cat /etc/apache2/sites-available/redmine.conf   
<VirtualHost *:80>  
        ServerName yourdomain.com  
        ServerAdmin root@localhost  
    DocumentRoot /var/www/public/redmine/public  
  
    ErrorLog ${APACHE_LOG_DIR}/redmine/redmine-error.log  
    CustomLog ${APACHE_LOG_DIR}/redmine/redmine-access.log combined  
  
        <Directory /var/www/public/redmine/public>  
            Options FollowSymLinks  
            AllowOverride None  
        </Directory>  
</VirtualHost>  
  
# ログ出力フォルダ作成  
root@raspberrypi:~# mkdir /var/log/apache2/redmine  
root@raspberrypi:~# chown -R www-data:www-data /var/log/apache2/redmine  
# 設定の有効化  
root@raspberrypi:~# a2enconf passenger  
root@raspberrypi:~# a2ensite redmine  
root@raspberrypi:/var/www/public# vi /etc/hosts  
root@raspberrypi:/var/www/public# cat /etc/hosts | grep redmine  
127.0.0.1       redmine  
root@raspberrypi:/var/www/public# systemctl restart apache2  
root@raspberrypi:/var/www/public# systemctl status apache2  
● apache2.service - LSB: Apache2 web server  
   Loaded: loaded (/etc/init.d/apache2)  

今回は /var/www/public 以下にRedmine用のフォルダを作成しています。
redmineに対してシンボリックリンクを張っているのは、今後redmineのバージョンをあげるときにリンクの貼り直しで済ませるためです。

あとはブラウザから接続を行い動作確認をしてみてください。
デフォルトのログインID/PWはadmin, adminでした。

あとがき

毎回思いますがRailsの導入には時間がかかりますね。
raspberry piでは普段と違ってCPU温度が気になります。自分はwatchコマンドを使って温度を眺めたりするのですが、そういう数字が常に変動するものをみているのが好きなのでずっと見てしまいます。
有意義に時間使うのであれば技術書でも読むとちょうどいいんでしょうね。

あともしかしてRaspbianというかDebianにはSElinuxはないのでしょうか?
簡単にしか調べてませんが、特に見当たらないですね。audit logもないし。
なんかこう、守られている感が減るので心細い。

Raspberry Pi2/ラズベリーパイ2にFedoraをインストール

Raspberry pi2にFedoraがインストールできるという情報を入手したので2台目を購入してインストールを行いました。

以前はpidoraというものがありましたが、こちらの更新は停止していてraspberry pi2には対応していません。
しかしその間にfedoraそのものがraspberry pi2にインストールできるようになっていたのです。
嬉しい限りです。

今回はraspberry pi2にfedoraをインストールして基本設定を行うところまでを行います。

インストール用イメージの作成

まずはディスクイメージを作成します。
今回はFedora Image Builder for Raspberry Pi 2というスクリプトを利用してイメージを作成します。

このスクリプトを実行するにはdebian系のOSが必要になります。
中で利用しているコマンドに依存しているようです。
手順はこちらのサイトが参考になります。

私はVirtual Boxにubuntuをインストールして実行しました。
いくつかパッケージが必要なので以下のコマンドで必要なパッケージのインストールを行ってください。

# apt-get xzdec git kpartx  

Linuxに慣れている方には問題とならない箇所かもしれませんが、一点注意。
settings.confファイルにある容量の設定には気をつけてください。

利用しているmicro sdにもよりますが、32GBのmicro sdを利用する場合には概ね以下のように設定すると良いと思います。

BOOTSIZE=200  
ROOTSIZE=29500  
COMPRESS=0  

私は嫌な予感がするなぁ〜と何も考えずに設定を行ったために、/以下の容量が3.6GBになり、追加でパーティションを切ることになりました。

パーティションサイズを指定するところで気づく方もいると思いますが、イメージの作成に結構容量を食います。
仮想マシン上にも領域を確保するとディスクがしんどいので共有フォルダを利用して、ホストマシン側の領域でスクリプトを実行することをお勧めします。

またもしCentOS等のRedhat系のOSからスクリプトを実行したい場合には以下のサイトを参考にしてください。
Linux Install Memo

中を開いて自分で修正するという、これこそインフラ屋さんという感じです。すごい。

Raspberry PIの起動

ディスクイメージを作成したら、SDへ書き込みraspberry piにセットします。
ここで、一つ注意点。

Micro SDへの書き込みはWindowsマシンから行うことをお勧めします。
私はMac Book Proから書き込みを行ったところraspberry piがディスクを上手く認識してくれずに起動しませんでした。

基本的には以下のページと同様の手順で起動までを行うと良いです。
Raspberry Pi/ラズベリーパイ にFedora(Pidora)をインストール

Fedora初期設定

マシンを起動したら初期設定を行っていきます。
最初に何点かインストール時の設定が聞かれますが、見てわかると思うので割愛します。
raspbianと違ってキーボードの認識も正しく行われるのでストレスが溜まらないのは個人的に評価高いです。

あとは通常のredhat系OSと同じように設定を行っていきます。

ネットワーク設定

最初にネットワーク設定を行い、固定IPを降りつつDNSgoogleDNSを指定します。

[root@localhost ~]# nmcli c add type ethernet ifname eth0 con-name eth0  
[root@localhost ~]# nmcli connection mod eth0 ipv4.method manual ipv4.addresses 192.168.1.12/24 ipv4.gateway 192.168.11.1 ipv4.dns 8.8.8.8  
[root@localhost ~]# nmcli c up eth0  
[root@localhost ~]# systemctl restart NetworkManager  
[root@localhost ~]# systemctl restart network  

nmcli cになっていたりconnectionになっていたりしますが、意味は同じです。
modと書いてある部分もmodifyでもmでも良いです。

最後のrestartは不要かもしれませんが、不安なので行っています。

ホスト名設定

ホスト名の設定を行います。

[root@localhost ~]# nmcli g hostname fedora-pi  
[root@localhost ~]# hostname  
fedora-pi  

パッケージ更新とインストール

パッケージの更新とよく使うパッケージのインストールを行います。

[root@localhost ~]# vi /etc/dnf/dnf.conf  
[root@localhost ~]# cat /etc/dnf/dnf.conf   
[main]  
gpgcheck=1  
installonly_limit=3  
clean_requirements_on_remove=true  
fastestmirror=true  
[root@localhost ~]# dnf upgrade  
[root@localhost ~]# dnf install wget tar less  

なんとFedora22からはyumではなくdnfというものを利用するようになっています。
これはkernelが4になったことによるものだそうです。

最初に設定しているのはfastestmirror=trueの追加です。
これによりfastestmirrorが有効になります。

dnf upgradeはyum updateと同じです。
fedora22のminimalではtarもlessも入っていなかったためインストールしています。
lessがないのには驚きました。

そのうちCentOSもdnfというものになるんでしょうかね。

ユーザ追加

管理用ユーザの追加を行います。

[root@localhost ~]# useradd raru  
[root@localhost ~]# passwd raru  
ユーザー raru のパスワードを変更。  
新しいパスワード:  
新しいパスワードを再入力してください:  
passwd: すべての認証トークンが正しく更新できました。  
[root@localhost ~]# usermod -G wheel raru  

wheelがredhat系の管理ユーザ用グループです。
raspbianではadmというグループでしたね。

root設定

wheelグループのものだけがroot化できるように設定します。

[root@localhost ~]# cp /etc/pam.d/su/etc/pam.d/su.org  
[root@localhost ~]# vi /etc/pam.d/su  
[root@localhost ~]# diff /etc/pam.d/su.org /etc/pam.d/su  
6c6  
< #auth       required    pam_wheel.so use_uid  
---  
> auth     required    pam_wheel.so use_uid  

ssh設定

鍵認証のみを許すように設定します。

[root@localhost ~]# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.org  
[root@localhost ~]# vi /etc/ssh/sshd_config  
[root@localhost ~]# diff /etc/ssh/sshd_config.org /etc/ssh/sshd_config  
49a50  
> PermitRootLogin no  
79c80,81  
< PasswordAuthentication yes  
---  
> PasswordAuthentication no  
> PermitEmptyPasswords no  
[root@localhost ~]# systemctl restart sshd  

このあたりはもう毎度おなじみですね。

ssh用鍵の作成

先ほど作成したユーザの鍵を作成します。

[root@localhost ~]# su - raru  
[raru@fedora-pi ~]$ ssh-keygen -t rsa  
Generating public/private rsa key pair.  
....  
[raru@fedora-pi ~]$ mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys  
[raru@fedora-pi ~]$ chmod 600 ~/.ssh/authorized_keys  
[raru@fedora-pi ~]$ cat ~/.ssh/id_rsa  

cronの設定

最新のredhat系OSではcronがanaconになっているので使い慣れているnoanacronにもどします。

[root@localhost ~]# dnf remove cronie-anacron  
[root@localhost ~]# dnf install cronie-noanacron  

これで基本的な設定は完了です。

OverClockテスト

今回購入したraspberry piのケースにはファンが付いているので、せっかくだからover clockを試してみたいと思います。
これも先ほど参考にさせていただいたサイトのpi2 fedora22 でOCという記事を参考にしました。

まずはover clock前の計測です。

[root@localhost ~]# dnf install gcc perl-Time-HiRes  
[root@localhost ~]# cd /usr/local/src  
[root@localhost src]# wget https://byte-unixbench.googlecode.com/files/UnixBench5.1.3.tgz  
[root@localhost src]# tar xvzf UnixBench5.1.3.tgz  
[root@localhost UnixBench]# cd UnixBench  
[root@localhost UnixBench]# ./Run  

それぞれCPU1つと全部合わせてのスコアです。
System Benchmarks Index Score 115.4
System Benchmarks Index Score 285.

当たり前ですがコア数が4でも単純に4倍にはならないのですね。
続いてover clockの設定と計測です。

[root@localhost UnixBench]# dnf install cpufrequtils  
[root@localhost UnixBench]# cpupower frequency-info  
...  
  current policy: frequency should be within 600 MHz and 900 MHz.  
                  The governor "powersave" may decide which speed to use  
...  
[root@localhost UnixBench]# cpupower frequency-set -g ondemand  
Setting cpu: 0  
Setting cpu: 1  
Setting cpu: 2  
Setting cpu: 3  
[root@localhost UnixBench]# cpupower frequency-info  
...  
  current policy: frequency should be within 600 MHz and 900 MHz.  
                  The governor "ondemand" may decide which speed to use  
...  
[root@localhost UnixBench]# ./Run  

System Benchmarks Index Score 159.3
System Benchmarks Index Score 397.7

性能は1.4倍くらいにあがっている感じですかね。
CPUの温度は最大で47度まで上昇しました。
通常時が33度くらいなので、そこそこ温まったようです。

ただ参考サイトの方の実験では64度まで上昇しているようでしたので、ファンの効果はなかなかたかそうですね。
ひとまずはこのover clockさせた設定のまま稼働させてみようと思います。

パーティションの拡張

こちらはディスクイメージ作成を正しく行った方には不要です。
私は正しく行わなかった方なので必要でした。

microsdが32GBあるのに、システム全体で4GBくらいしか容量を使用しておらず残りが無駄になってしまっていたので、パーティションを追加していきます。
ルートのパーティションを拡張することも考えたのですが、インストールCDをブートしてどうこう書いてあったので、raspberry piのブートCDってなんだよ。。。ってことになり諦めました。

# ディスクのデバイス名を確認  
[root@localhost ~]# fdisk -l  
...  
Device         Boot   Start      End  Sectors  Size Id Type  
/dev/mmcblk0p1         2048   411647   409600  200M  e W95 FAT16 (LBA)  
/dev/mmcblk0p2       411648  7784447  7372800  3.5G 83 Linux  
[root@localhost ~]# fdisk /dev/mmcblk0  
  
fdisk (util-linux 2.26.2) へようこそ。  
ここで設定した内容は、書き込みコマンドを実行するまでメモリのみに保持されます。  
書き込みコマンドを使用する際は、注意して実行してください。  
  
  
コマンド (m でヘルプ): n  
パーティションタイプ  
   p   基本パーティション (2 プライマリ, 0 拡張, 2 空き)  
   e   拡張領域 (論理パーティションが入ります)  
選択 (既定値 p): p  
パーティション番号 (3,4, 既定値 3): 3  
最初のセクタ (7784448-62333951, 既定値 7784448):   
最終セクタ, +セクタ番号 または +サイズ{K,M,G,T,P} (7784448-62333951, 既定値 62333951): +26624M  
  
新しいパーティション 3 をタイプ Linux、サイズ 26 GiB で作成しました。  
  
コマンド (m でヘルプ): p  
ディスク /dev/mmcblk0: 29.7 GiB, 31914983424 バイト, 62333952 セクタ  
単位: セクタ (1 * 512 = 512 バイト)  
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト  
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト  
ディスクラベルのタイプ: dos  
ディスク識別子: 0x000611c3  
  
デバイス       起動 開始位置 最後から セクタ サイズ Id タイプ  
/dev/mmcblk0p1          2048   411647   409600   200M  e W95 FAT16 (LBA)  
/dev/mmcblk0p2        411648  7784447  7372800   3.5G 83 Linux  
/dev/mmcblk0p3       7784448 62310399 54525952    26G 83 Linux  
  
コマンド (m でヘルプ): w  
パーティション情報が変更されました。  
ioctl() を呼び出してパーティション情報を再読み込みします。  
パーティション情報の再読み込みに失敗しました。: デバイスもしくはリソースがビジー状態です  
  
カーネルは古い情報を使用しています。新しい情報を利用するには、システムを再起動するか、もしくは partprobe(8) または kpartx(8) を実行してください。  
  
[root@localhost ~]# reboot  
  
# パーティションが増えていることを確認  
[root@fedora-pi ~]# fdisk -l /dev/mmcblk0  
Disk /dev/mmcblk0: 29.7 GiB, 31914983424 bytes, 62333952 sectors  
Units: sectors of 1 * 512 = 512 bytes  
Sector size (logical/physical): 512 bytes / 512 bytes  
I/O size (minimum/optimal): 512 bytes / 512 bytes  
Disklabel type: dos  
Disk identifier: 0x000611c3  
  
Device         Boot   Start      End  Sectors  Size Id Type  
/dev/mmcblk0p1         2048   411647   409600  200M  e W95 FAT16 (LBA)  
/dev/mmcblk0p2       411648  7784447  7372800  3.5G 83 Linux  
/dev/mmcblk0p3      7784448 62310399 54525952   26G 83 Linux  
  
# 作成したパーティションext4としてファイルシステムを作成  
[root@fedora-pi ~]# /sbin/mkfs.ext4 /dev/mmcblk0p3   
mke2fs 1.42.12 (29-Aug-2014)  
Discarding device blocks: done                              
Creating filesystem with 6815744 4k blocks and 1703936 inodes  
Filesystem UUID: 07b79748-2a1b-4c02-8c8a-ba999c85cfa6  
Superblock backups stored on blocks:   
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,   
    4096000  
  
Allocating group tables: done                              
Writing inode tables: done                              
Creating journal (32768 blocks): done  
Writing superblocks and filesystem accounting information: done    
  
# 作成したパーティションをマウント  
[root@fedora-pi ~]# mkdir /data  
[root@fedora-pi ~]# vi /etc/fstab  
[root@fedora-pi ~]# cat /etc/fstab   
UUID=7c321d6b-f2b0-4783-9576-e3dfe657f9b3 / ext4 defaults,noatime 0 0  
/dev/mmcblk0p1 /boot vfat defaults 0 0  
/dev/mmcblk0p3 /data ext4 defaults,noatime 0 0  
[root@fedora-pi ~]# mount -a  

ちょっと長くなったのでコードにコメントを追加しました。
まずはデバイス名を取得して、パーティションを作成しています。
このときに +****Mという形でサイズを直接指定していますが、ここは空欄のままの方が良さそうです。
そうすると自動的に残りの容量全てを利用してパーティションを作成してくれます。

私はセレクタの容量への変換の仕方がよくわからず62333951というセレクタが、どれくらいの容量の拡張なのかわからなかったので指定しました。

あとはリブートしてから、先ほど作成したパーティションを初期化してマウントです。
ここでmkfsを実行し忘れるとエラーが発生してマウントできないので注意です。

今回の購入物

[amazonjs asin="B00T356SFO" locale="JP" title="Raspberry Pi 2 Model B (1)"]

[amazonjs asin="B011BWXGN8" locale="JP" title="Eleduino Raspberry Pi 2 Model B アクリル ケース ブラック Black +MINI ファン パッケージ"]

[amazonjs asin="B00YM3OOKS" locale="JP" title="Raspberry Piラズベリーパイ)用 1ポート USB 電源アダプター"]

[amazonjs asin="B00CES44EO" locale="JP" title="【Amazon.co.jp限定】Transcend microSDHCカード 32GB Class10 UHS-I対応 (無期限保証) Newニンテンドー3DS 動作確認済み TS32GUSDU1E (FFP)"]

今回はこの4つを購入して組み立てました。
アクリルケースは細くなっている部分が折れやすいので気をつけて下さい。

前回購入したものと違ってファンが付いていたり、固定用のゴム製の足がシールで同梱されていました。
ファンの性能はUnix Benchで試した通り、15度くらいは温度を下げてくれるみたいです。
また気になる音の方は非常に静音で、耳を近づけても音が聞こえないレベルです。

個人的には非常に満足しています。

ちなみ完成するとこんな感じ。
raspberrypi2_ファン

あとがき

Fedoraは普段使っていませんが、redhat系のOSなのでRaspbianと違って設定が非常にスムーズに進みます。
今回パーティション設定をミスしていしまったので、今後拡張した領域にいろいろとデータを保存していくことになりそうなのでSELinuxの設定が大変になりそうだなぁと今から少し憂鬱。

ですが、ついにRaspberry piでもfedoraが利用できるということで非常にサーバ用途として使いやすくなりました。
CentOSの対応が早く来てくれたらいいのになぁ、と思っております。

なんだかんだでfedoraは安定長期運用が用途ではないでしょうからねぇ。

参考サイト一覧

今回参考にさせていただいたサイト。
JUNKHACK
Linux Install Memo

両サイトとも非常に経験と知識を感じる内容でした。

個人でのProxyサーバ利用用途

Proxyサーバを建てたいということで、利用用途を考えていました。
まずサイト高速化であったり冗長化、移行の易化のためにリバースプロキシを建てるのが浮かんだのですがあくまで普通のProxyサーバが建てたかったの一旦思考から除外しました。

今回は一旦情報の整理を行います。

Proxyサーバを経由する利点

まずはなぜProxyを利用するのかという点です。
具体的に自分が使っていないので、あくまで受け売りになりますが大体以下。

・通信元の匿名化
・通信のフィルタリング
・キャッシュによる通信量軽減と見た目上の高速化
・通信障害の回避

他はサイトによりまちまちでしたが、個人的にはレジューム機能があるのかなと思いました。
ただおそらくこれは利用するミドルウェアによるのでProxyそのものの機能ではないです。

個人で使うときのメリットってほぼほぼ匿名化の部分なんじゃないかと感じます。

では非常に簡単にですが、それぞれ私の理解を記載したいと思います。

通信元の匿名化

通常の通信は [クライアント] -> [サーバ] という形で行われるため、サーバはこの後クライアントへレスポンスを返すために相手の「位置」を知っています。これがIPアドレスになるわけです。

しかしProxyを通すと通信は以下のようになります。
[クライアント] -> [Proxy] -> [サーバ]

こうするとサーバにとってのクライアントはProxyになりますので、サーバからはクライアントマシンのIPは必要がなくなりますし、やりとりもされません。
つまりクライアントの位置を知られずに済むということです。

IPアドレスだけではあまり情報を知られることはありませんが、場合によっては住んでいる都道府県や市区町村程度までなら検索することができるのでProxyを通すことでこれを隠すことがでますね。

よくネットを利用した犯罪が行われるときに串を通す、といいますが串とはproxyサーバのことです。

余談ですが、私も過去高校生エンジニアの子とskypeでチャットしたことがありますが、その子が作成していたちょっとした攻撃ツールで私の家宛にパケット送られまくって回線が潰されたことがあります。
IPが漏れてしまうとそういう気紛れな嫌がらせをされることがあるので、それを防ぐことができますね。

恐ろしい子供です。

通信のフィルタリング

これはおそらく個人で使うことはないでしょう。
ただし個人でもお子さんがいる場合には、通信をproxy経由にすることでお子さんがエロサイトを閲覧することを防ぐことができるかもしれません。

会社で運用する場合には業務に利用する必要のないサイトを制限するなどが可能です。

キャッシュ

これは一度通信した内容をproxyサーバにキャッシュさせることで通信を高速化するというものです。

個人的には回線が高速になり、マシンパワーも十分ある今の時代にそこまでしてキャッシュする意味があるのかと感じます。
またキャッシュ期間をどうするかによりますが、接続先サイトが更新されていたのにキャッシュされてしまっていると新しいコンテンツが閲覧できないのが不便です。
キャッシュ期間が長いとその可能性が高まりますし、短いのでは意味がない、さらにブラウザ自体にもキャッシュがあるのでもうそれ必要なんだっけ? という自分への問いかけに答えられなかったです。

しかし会社などで利用する場合には、全接続のうちいくつかの上位サイトで通信の大きな割合を占めてしまうこともあるらしいので効果が見込めそうだとも思いました。

少し別になりますが、先ほど少し触れたレジューム機能というものはもしかしたら少し便利かもしれません。
これは一度切断されて途中で終わってしまったダウンロードなどを続きから再開したりできる機能みたいです。
これはsquidというミドルウェアには用意されています。squidはかなりメジャーなミドルウェアです。

ただこれも普段はダウンロードをブラウザからしか行わないので、ブラウザのアドオンや元々の機能で十分な気がしています。

通信障害の回避

普段の通信経路が死んでしまっているときに、proxy経由の経路を利用することで通信が可能になる可能性があるということですね。
普段ネットを利用していて通信障害に遭遇した感じることは滅多にないので、あまりこれをメインに導入しようとは思いません。

導入を踏みとどまっている理由

導入を検討していたのに踏みとどまっているのは、おそらく「一般人」共通の問題ですが回線が固定IPじゃないからです。
固定IPがないということはIP制限をかけるのが難しいということになります。

固定IPにするにはプロバイダにお金を払って固定で振ってもらわないといけなかったりするので、高いですし面倒です。

squid(proxyのミドルウェア)では、proxyを利用できる接続をIPなどで制限できます。
私はどうしてもそれが使いたい。

IP以外の制限方法

とはいえないものはないので、他の方法を考えるしかありません。
他には以下がありそうでした。

・認証による制限
ドメインによる制限

認証による制限はよくありますね。
IP/PWを正しく入れた人にしか使えないというものです。
ただパソコンによる気合いと根性で突破可能なのであまり気が進みません。

ドメインによる認証も固定IPがないとやりづらいのですが、これはDDNSを利用することでなんとかなるのではと考えています。
まだ試していないので不明ですが、そのうち試してみようと思います。
しかしそこまでしてIPを隠したいのかという話もあって悩んでいます。

結局他のサーバも私名義で借りているため、匿名化したところで外からは私名義のサーバが通信しているだけです。
IPが流出しないので意味がないわけではないのですが、仮に自分の家の回線が攻撃されるのを防いでも我がproxyサーバのIPで攻撃されてもなぁという。

whois自体は代行サービスで私の情報は出ていないので、まぁ多少意味あるし勉強が目的でし建てるのもありでしょうかね。

屋内に建てたくない理由

通信の匿名化ができなければ、個人的に感じるメリットはほぼほぼなくなります。
さらに屋内にはクライアントマシン以外にはraspberry pi2と、うるさすぎて停止しているデスクトップ型の鼻毛鯖しかありません。
あまり余計なものを入れたくないのと、うるさいから起動したくないのでメリットに対するデメリットが大きいです。

総括

一般ご家庭のproxyサーバはあまり旨味を感じない。

あとはもうほんと趣味と勉強がてらDDNSをお試しですね。

あとがき

私としてはここに時間をかけるのであれば、rasberry pi2をもう一個買ってどこぞで見つけたfedoraインストール方法を試して家の中で小さなネットワーク構築をしつつDNSを建てることがしたいですね。

DDNSは正直全くやりたいとは思っていないのですが、やってみましょうかね。

またproxyを調べていたら、最近外に充実しているフリーwifiを安全に利用するのにproxyサーバが便利と書いてあったような記憶がありましたが、未だに理由がわかりません。
フリーwifiに繋いだ時点で、そこから先の経路とかどうでもいい気がするのですが……。

今回お世話になったサイト

今回はいろいろなページをみましたが、以下の2つのサイトが非常にわかりやすく内容も充実していると思いました。
Cyber Syndrome | proxyサーバ入門

プロキシの役割とその仕組み

素晴らしい情報提供を行ってくださっているサイト運営者の方に日々感謝です。

ZabbixからsSMTPを利用してエラー通知メール送信

今回はsSMTPを利用してRaspbian上のZabbix Serverからアラートメールの送信を行います。
また、合わせてサーバ監視の設定も行いたいと思います。

ただしzabbix agentは利用していません。
今のところはhttp, httpsの監視だけで充分だと考えています。

監視対象ホストの追加

まずは監視対象ホストを追加します。
ホスト設定とメール設定の順番は前後しても問題ないのであまり気になさらず。

まずはzabbixのウェブ管理画面へアクセスして[Configuration] -> [Hosts]と選択してください。
その後create hostを選択して、ホストを追加していきます。

ホスト追加設定1

今回はこのブログサーバを対象に監視しているので、ホストにはドメインを指定。
表示用の名前も同じで充分なので同様に。
グループはデフォルトで用意されていたlinux serverを指定しました。
新しく作成しても、他を指定しても構いません。自分が管理するためのグルーピングですので監視動作自体に影響はないはずです。

またzabbix-gentを利用しなくても Agent interfaces設定は必要になってしまうのでDNSにしつつそれっぽく指定しています。指定しているだけで実際には利用されていません。

ここまで設定ができたら、テンプレートタブを選択して監視する内容を設定します。

ホスト追加設定2

Link new templateのフォーム右にあるselectを押すと、テンプレート一覧が開くのでそこからhttp, httpsを選択して、Addボタンを押した後の画面です。
あとはSaveを選択して保存すれば完了です。

ホスト追加設定3

これで監視対象のホスト設定が追加されました。

sSMTPアラートメール設定

続いてメール送信の設定を行います。
Zabbixのメール送信では送信用のsmtpを設定するものがあります。
しかしsSMTPでは通信の受付を行う用のsmtpを自分自身に持っていないため、この設定が使えません。

仕方がないので他に用意されているスクリプトの設定を行い、そのスクリプトからsSMTPを利用したいと思います。

まずは[Administration] -> [Media Type] -> Create media typeを選択と画面を遷移していきます。
そうすると以下のような画面が表示されるのでタイプがscriptとなる、メディアタイプを追加します。

メール用設定1

次はメールの宛先の設定を行います。
[Administration] -> [Users]と画面を移動して、以下の画面にある Admin (Zabbix Administrator)を選択していきます。

メール用設定2

そうすると画面が遷移しますので、その画面の中からメディアタブを選択して[追加]リンクを選択して設定を行います。

ホスト追加設定3

この設定ではhogehoge@gmail.com宛に、24時間、毎日時間関係なしでメールを送信するようになります。
曜日や時間を設定したい方は時間の設定を編集してください。
個人的には24時間365日しないのであれば、なんのための監視なんだと思いますが。

以上でzabbix上の設定は完了です。

shellスクリプト作成

先ほど設定したシェルを作成します。
また、合わせてもろもろ設定の確認や権限設定をしましょう。

root@raspberrypi:~# cat /etc/zabbix/zabbix_server.conf | grep AlertScriptsPath  
### Option: AlertScriptsPath  
# AlertScriptsPath=${datadir}/zabbix/alertscripts  
# 設定したシェル配置用directory  
AlertScriptsPath=/etc/zabbix/alert.d/  
  
root@raspberrypi:~# vi /etc/zabbix/alert.d/zabbix-alert-mail.sh  
root@raspberrypi:~# chown zabbix:zabbix /etc/zabbix/alert.d/zabbix-alert-mail.sh   
root@raspberrypi:~# chmod 744 /etc/zabbix/alert.d/zabbix-alert-mail.sh   
root@raspberrypi:~# ls -l /etc/zabbix/alert.d/zabbix-alert-mail.sh   
-rwxr--r-- 1 zabbix zabbix 240 111 00:57 /etc/zabbix/alert.d/zabbix-alert-mail.sh  
root@raspberrypi:~# cat /etc/zabbix/alert.d/zabbix-alert-mail.sh   
#!/bin/sh  
  
export MAIL_TO="$1"  
export SUBJECT="$2"  
export CONTENT="$3"  
  
echo "$CONTENT" > /tmp/mymailinput_$$  
  
mail -E -s "$SUBJECT" $MAIL_TO < /tmp/mymailinput_$$  
rm /tmp/mymailinput_$$  

まずはシェルを配置する場所を確認します。
次にシェルを作成して、権限の設定です。

シェルの中身自体は、先ほど設定していた値がzabbixから渡されるのでそれを利用してmailコマンドを叩いているだけです。
mailコマンドを叩けばsSMTPが利用されるので無事メールが送信されるということですね。

また動作検証を行うときにはhttp通信を落とすためfirewallを閉じるかアプリケーションサーバのデーモンを停止するなどがあります。
私はそもそも起動させてないぜんぜん関係ないサービスを監視対象にして動作検証を行いました。
そもそもhttp, httpsを止めたくはありませんので。

以上で基本的な監視設定は完了かと思います。

あとがき

基本的な設定は完了したとか言いつつ、アラート通知後何分間状態に変化がないと再通知が来るのか気になっています。
そもそもzabbixがどんなことができて、どういう設定があるのか理解していないのであとは随時使いながら覚えていこうと思います。

参考サイト

今回ウェブの管理コンソールからの設定は以下の方のものが非常に参考になりました。
Zabbixを使ってエージェント無しで単純な Webサイト監視だけを行う最短の方法

Raspbianでメール送信 ssmtp編

Raspbianで監視などをおこなっているとメールが送信したくなります。
とりあえず何かと管理用にメールが欲しくなります。

ただドメインとも紐付いていない、固定IPでもないメールサーバを立てるのは思いの外面倒です。
postfixを入れて頑張るのも良いですが、なんだかんだでやっぱ面倒なのです。

今回は私も始めて利用するssmtpというものでメールを送信してみましょう。

送信と言いつつも、やっていることはroot宛のメール転送です。

ssmtpインストール

まずはインストールです。
おなじみのaptitude

root@raspberrypi:~# aptitude install heirloom-mailx ssmtp  

raspbianはそもそもmailコマンドがないのでそちらも合わせてインストールします。

ssmtpを設定

インストールが終わったら、早速設定です。
驚くほど簡単で驚きました。

root@raspberrypi:~# cp /etc/ssmtp/ssmtp.conf /etc/ssmtp/ssmtp.conf.org  
root@raspberrypi:~# vi /etc/ssmtp/ssmtp.conf  
root@raspberrypi:~# cat /etc/ssmtp/ssmtp.conf  
#  
# Config file for sSMTP sendmail  
#  
# The person who gets all mail for userids < 1000  
# Make this empty to disable rewriting.  
root=yourmail@yourdomain.com  
  
# The place where the mail goes. The actual machine name is required no   
# MX records are consulted. Commonly mailhosts are named mail.domain.com  
mailhub=smtp.gmail.com:587  
  
# Where will the mail seem to come from?  
#rewriteDomain=  
  
# The full hostname  
# hostnameは特になんでも問題なし。  
hostname=rasp2raru.com  
  
# Are users allowed to set their own From: address?  
# YES - Allow the user to specify their own From: address  
# NO - Use the system generated From: address  
#FromLineOverride=YES  
  
AuthUser=hogehoge@gmail.com  
AuthPass=********  
UseSTARTTLS=YES  

いやぁ、こんだけで終わるんですね。シンプルでいいです。
結局転送しているだけみたいですね。
postfixでrelayhost設定しているのと同じなのでしょう。

特にこのサーバは受信の予定もないので、これで十分といえば十分です。

<2015/11/1 追記>
勘違いしていたのですが、転送しているのはrootであってメールの送信自体は宛先に関わらず外部へ送る場合にはsSMTPを通してgmailから行われています。
root宛のlocalメールだけをgmailへ依頼しているわけではありません。

動作検証

設定が終わったら動作検証です。

root@raspberrypi:~# mail root  
Subject: test mail  
this is test.  
.  
EOT  

mailコマンドでroot宛にメールを送ってみましょう。
これが転送されて、あなたのメールアドレス宛に届きます。

<2015/11/1 追記>
自分のメールアドレスを直接指定した場合にもメールが送信されます。

あとがき

大勢で使うサーバではあまり利用しないほうが良いような気がしますが、個人でライトに使う分には充分だと感じました。
というか、メール系はちゃんとドメインを取得しないと逆にわかりづらいです。
そういう意味でも他のサーバよりも敷居が高いですよね。