2016年4月8日金曜日

CentOS7にClamdを入れてもウイルス検知しない。

研究室のサーバーを新しく作ることになって、CentOS7でやってます。
CentOS7にした理由は、講義で触ったことがあるからです。
Clam Anti Virus(clamav)は有名なアンチウイルスソフトで、yumでインストールできます。
今回はclamavを導入しようとして問題が起きたことを書きます。

下調べ

  1. 基本はアンチウィルスソフト導入を見ながら構築
  2. RPMforgeは導入済み(RPMforgeリポジトリ導入CentOS7にサードパーティリポジトリの追加を見ながら)
  3. 本家Clamavのドキュメントを見ながら

やったこと

まず、RPMforgeリポジトリを入れるところから。
yum-plugin-prioritiesを入れて、これから追加するリポジトリに対してpriority(使用する優先度)をつけていく。これでリポジトリの中身が競合しないはず。

yum -y install yum-plugin-priorities
vi /etc/yum.repos.d/CentOS-Base.repo (標準リポジトリ設定ファイルを編集)
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5
priority=1 ← 追加
#released updates
[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5
priority=1 ← 追加
#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-5
priority=1 ← 追加

そして、RPMforgeを追加する。
wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm
rpm -ivh rpmforge-release-*.rpm
rm -f rpmforge-release-*.rpm
yum -y update rpmforge-release
view raw gistfile1.txt hosted with ❤ by GitHub
ついでに、epelリポジトリとremiリポジトリも追加する。
#epelリポジトリ追加
yum -y install epel-release
vi /etc/yum.repos.d/epel.repo (enabled=0にする)
#remiリポジトリ追加
rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
vi /etc/yum.repos.d/remi.repo (enabled=0を確認)
view raw gistfile1.txt hosted with ❤ by GitHub
この3つのリポジトリを使うためには--enablerepoオプションを明示しておく必要があります。ただ、僕はその方が間違って他のリポジトリからインストールしないと思うので、明示的にしました。

ここからが本番。

clamavを導入します。
yum -y install clamd
vi /etc/clamd.conf
User clamav
#User clamav ← 行頭に#を追加(root権限で動作するようにする
clamdソケットファイル格納ディレクトリ自動生成設定ファイル作成
vi /etc/tmpfiles.d/clamd.conf
d /var/run/clamav 0755 root root -
自動起動設定
systemctl start clamd
systemctl enable clamd
ウイルス定義ファイルの更新機能を有効にする
sed -i 's/^Example/#Example/g' /etc/freshclam.conf
ウイルス定義ファイルの最新化
freshclam
これで、/etc/cron.daily/freshclamが毎日自動で行われる。
view raw gistfile1.txt hosted with ❤ by GitHub
ちょっと雑になってきた...。

問題点

clamavをインストールしたからには、ウイルスを検知するはず。テストウイルスを用いた検知を行ってみます。
clamscan --infected --remove --recursive
----------- SCAN SUMMARY -----------
Known viruses: 116966
Engine version: 0.90.2
Scanned directories: 5
Scanned files: 35
Infected files: 0 
Data scanned: 0.24 MB
Time: 31.298 sec (0 m 31 s)
view raw gistfile1.txt hosted with ❤ by GitHub
これは当然の結果。 次は、ウイルスのある状態です。eicar.comというテストウイルスを使います。
まずは、ウイルスがない状態で。
wget http://www.eicar.org/download/eicar.com
clamscan --infected --remove --recursive
----------- SCAN SUMMARY -----------
Known viruses: 116966
Engine version: 0.90.2
Scanned directories: 5
Scanned files: 35
Infected files: 0 
Data scanned: 0.24 MB
Time: 31.298 sec (0 m 31 s)
(注意:この結果はコピペですが、実際に反応しませんでした。)
view raw gistfile1.txt hosted with ❤ by GitHub
あ、あれ??
なんで反応しないんだろう?単体でテストしても引っかかりません。あるぇー?
ここでこの問題の原因を予想します。

  1. もしかしたら方法が間違ってる?
  2. もしかしたら学科にUTMがあるから?
  3. もしかしたらバージョンが古い?

結果

1について、
友人に検証してもらった結果、できませんでした。

2について、
友人の環境で同じ方法で検証してもらいましたが、できませんでした。

3について、
調べた結果、バージョンが少しだけ古いですね。
というのも、最近RPMforgeリポジトリはメンテされてないらしいんです。
でも、epelを使ってもできないからな〜。

2016年4月1日金曜日

go langを勉強してみる(1)

「並列処理できる言語ないかなー。Cばっかりだし、他のがいいよー」とか思ってたら、学内でgo lang勉強会が開かれてたので参加してみた。

やってたこと

goは講義でも聞いたけど、触るのは初めて。
勉強会では、ツアーをして構文に慣れることから始めました。

触ってみての感想

変な感じの言語だなー、と。僕はCとRubyを主に使ってたので入りは楽でした。
どんな感じで変かというと、
  • 型宣言が変(型宣言が後にくる)
  • return文が変(最初に宣言するパターンとreturnに明示するパターン)
  • for文とif文に()がなくて変(これカッコを入れるとエラーなんだぜ?)
  • 構造体pointerが変(たまに変な挙動が)

package main
import "fmt"
func main() {
sum := 0
for i := 0; i < 10; i++ {
sum += i
}
fmt.Println(sum)
}
view raw for hosted with ❤ by GitHub
package main
import (
"fmt"
"math"
)
func pow(x, n, lim float64) float64 {
if v := math.Pow(x, n); v < lim {
return v
}
return lim
}
func main() {
fmt.Println(
pow(3, 2, 10),
pow(3, 3, 20),
)
}
view raw if_func hosted with ❤ by GitHub
func split(sum int) (x, y int) {
x = sum * 4 / 9
y = sum - x
return
}
view raw return hosted with ❤ by GitHub
func add(x, y int) int {
return x + y
}
view raw type hosted with ❤ by GitHub
package main
import "fmt"
type Vertex struct {
X int
Y int
}
func main() {
v := Vertex{1, 2}
p := &v
p.X = 1e9
fmt.Println(v)
}
view raw Vo_pointer hosted with ❤ by GitHub

でも、便利なものもあって
  • 型推論が便利(:=が便利)
  • deferが便利(遅延して実行してくれるのは何かに役立ちそう)
  • sliceが便利(初めての概念)

今回はできなかった並列分散のgo routin(?)は今度やってみます。