プロジェクト

全般

プロフィール

ServersMan » 履歴 » バージョン 2

kanata, 2025/04/13 16:32

1 1 kanata
# ServersMan
2
3
ServersMan@VPS
4
http://dream.jp/vps/
5
6
{{toc}}
7
8
# CentOS7の諸設定
9
10
## localeの変更(UTF8)
11
12
言語変更は/etc/sysconfig/i18nではなくなっている。
13
14
```
15
# vi /etc/locale.conf
16
17
#LANG=C 
18
LANG="ja_JP.UTF-8"
19
```
20
21
でコンソールの日本語化が可能。
22
23
## rootによるSSHの禁止
24
25
26
```
27
# vi /etc/ssh/sshd_config 
28
29
- #PermitRootLogin yes
30
+ PermitRootLogin no 
31
32
```
33
34
## yumでのinitscripts更新の除外
35
36
なんとなく # yum update すると大変なことになるので注意。
37
38
CentOSに含まれるパッケージと、仮想化プラットフォームの相性により、
39
initscriptsを更新してしまうと、(再起動などのタイミングで)以降起動に失敗する。
40
41
- [OS初期時] initscripts-9.49.17-1.el7_0.1.x86_64
42
- [誤ってupdateした後] initscripts-9.49.24-1.el7.x86_64
43
44
こうなると、もうリモートから接続できなくなるので対処のしようがなく
45
ServersMan@VPSの中の人にお願いして、直してもらうしかない。
46
47
誤って更新しないよう、yumの更新対象から除外する。
48
49
```
50
# vi /etc/yum.conf
51
52
+ exclude=initscripts*
53
```
54
55
## airdisplay(ajaxterm)の停止
56
57
デフォルトで設定されている。
58
これはどういうものかというと、ブラウザ経由で端末操作できてしまうもの。
59
60
例えば、ブラウザに
61
62
```
63
http://xx.xx.xx.xx/airdisplay/
64
```
65
66
と入力すると、もうログイン画面である。セキュリティ的にすごい気になる。
67
なので、止める。
68
69
```
70
# service ajaxterm stop
71
```
72
73
これで止まるのだが、リブートすると戻るので、
74
以下を実行すれば恒久的に止まる。
75
76
```
77
# systemctl disable ajaxterm.service
78
```
79
80
念のため、apacheの設定ファイルもどけておく
81
82
```
83
# cd /etc/httpd/conf.d
84
# mv -i proxy_ajaxterm.conf proxy_ajaxterm.conf.org
85
# service httpd restart
86
```
87
88
と、ここまでやっても、再起動すると勝手に起動してくる(!?)。
89
とりあえず、再起動毎に忘れずに止める運用で。
90
91
92
## 時刻同期
93
94
ServersManのサポート曰く、自動で行われるらしい。
95
96
97
## 不要なサービスの停止
98
99
saslauthd→SASL認証使ってない
100
xinetd→こっから呼び出すサービス使ってない
101
ので
102
103
```
104
# service saslauthd stop
105
# service xinetd stop
106
# systemctl disable saslauthd.service
107
# systemctl disable xinetd.service
108
```
109
110
## ApacheのServer情報を隠す
111
攻撃のヒントを与えてしまう場合があるので隠蔽する。
112
113
```
114
# vi /etc/httpd/conf/httpd.conf
115
116
 + ServerTokens Prod
117
 + ServerSignature Off
118
```
119
120
として、2行追加したら apache を再起動して反映する。
121
122
```
123
# service httpd restart
124
```
125
126
## EPEL リポジトリ導入 
127
EPEL リポジトリとは、CentOS 標準のリポジトリでは提供されていないパッケージを、yum コマンドでインストールすることを可能にするエンタープライズ向けのリポジトリのことです。サードパーティー製リポジトリの中では信頼性の高いものになっています。
128
129
```
130
# yum install epel-release
131
# yum repolist
132
```
133
134
## Clam AntiVirus 導入 
135
136
ウィルス対策ソフトである Clam AntiVirus を導入する。
137
138
```
139
# yum install clamav clamav-update
140
```
141
142
ウィルス定義ファイル更新機能の有効化。
143
144
```
145
# vi /etc/freshclam.conf
146
147
- Example
148
+ #Example
149
```
150
151
ウィルス定義ファイル最新化。
152
153
```
154
# freshclam
155
```
156
157
ウィルススキャンテスト。
158
159
```
160
# clamscan --infected --recursive /tmp
161
```
162
163
実際にチェックするには、こんな感じにする。
164
165
```
166
# clamscan --infected --recursive --exclude-dir='/sys|/proc|/dev' /
167
```
168
169
* --infected   感染を検出したファイルのみを結果に出力
170
* --recursive   指定ディレクトリ以下を再帰的に検査 圧縮ファイルは解凍して検査
171
* --log=FILE   ログファイル
172
* --move=DIR   感染を検出したファイルの隔離先
173
* --remove   感染を検出したファイルを削除
174
* --exclude=FILE   検査除外ファイル(パターンで指定)
175
* --exclude-dir=DIR 検査除外ディレクトリ(パターンで指定)
176
177
## Rootkit Hunter 導入 
178
179
rootkitがLinuxサーバーにインストールされてしまっていないかチェックする。
180
181
インストール 
182
183
```
184
# yum install rkhunter 
185
```
186
187
定義を更新する。
188
189
```
190
# rkhunter --update
191
# rkhunter --propupd
192
```
193
194
非対話モードでチェック(Enterを要求されない)エラーのみ表示する場合は、オプションを付加
195
デフォルトでは、ログが /var/log/rkhunter.log に出力される。
196
197
```
198
# rkhunter --check --skip-keypress --report-warnings-only
199
```
200
201
初回はいろいろ Warning が出力されるかもしれないが、ググって解消させる。
202
203
204
205
## AIDE 導入
206
207
オープンソースのホスト型侵入検知システム(HIDS)。
208
209
インストール 
210
211
```
212
# yum install aide
213
```
214
215
データベースファイルの作成 
216
217
```
218
# aide --init
219
# cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
220
```
221
222
改ざんチェック 
223
224
```
225
# aide --check
226
```
227
228
データベースファイルの更新 
229
230
```
231
# aide --init
232
# cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
233
```
234
235
設定ファイルの編集 
236
237
必要に応じて、編集する。というか、そうしないと日常的に更新されるファイルも改ざんとして通知されるので、ググって除外しよう。
238
239
```
240
# vi /etc/aide.conf
241
```
242
243
## ざっくり日本国内だけ通信許可するiptables
244
245
IPアドレスの第一オクテッドだけ見て判断するようiptablesに設定しました。
246
247
こういう事が起こっていました。
248
249
- アメリカとか中国とか色んな国から、なんか悪いことを目的としたアクセスが頻繁にくる。
250
- よって、httpとhttps以外のポートは全て閉じたいが、自分的に不便。
251
- そうだ、日本国内だけ許可したらいいじゃない。
252
- ところが、SeversMan@VPSのCentOSのiptablesは、登録できるエントリー上限が256の模様(未確認)。
253
- なんとか256個の制限内に収めたい。
254
255
なので、こういう事にしました。
256
257
- 厳密に日本で使っているIPアドレス帯を許可しだすと膨大なエントリーになりそう。
258
- ipアドレスの第一オクテッド(つまり、aaa.bbb.ccc.ddd のaaa)だけを見て、日本かどうか判断しよう(適当)。
259
260
そこでまず、日本でどういうIPアドレス帯が使われているのか調べます。
261
以下にまとめて下さっている方がおります。
262
263
http://nami.jp/ipv4bycc/cidr.txt
264
265
日本管理のIPアドレスが何レコードあるか見てみますか~
266
267
```
268
$ curl http://nami.jp/ipv4bycc/cidr.txt|grep JP|wc -l
269
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
270
                                 Dload  Upload   Total   Spent    Left  Speed
271
100 1711k  100 1711k    0     0  3624k      0 --:--:-- --:--:-- --:--:-- 3625k
272
2297
273
```
274
275
2297件!やっぱり多い。
276
277
そこで、こんなことして、第一オクテッドだけにまとめちゃう。
278
279
```
280
$ curl http://nami.jp/ipv4bycc/cidr.txt|grep JP|awk -F'.' '{print $1,".0.0.0/8"}'|sort|uniq|sed -n 's/^JP\t//p'|sed -n 's/ //p'
281
```
282
283
こうすると88件にまとまってくれた。
284
もちろん、第一オクテッドしか見てないので、諸外国も混ざっちゃうんだけどだいぶリスクは下げたれたんじゃなかろうか。
285
286
後は、iptablesのINPUTチェインをDROPポリシーに設定した上で、ACCEPTとしてとして登録するだけ。
287
こんな感じの定義(いろいろ省略してます)
288
289
```
290
*filter
291
:INPUT DROP [0:0]
292
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
293
-A INPUT -i lo -j ACCEPT
294
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
295
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
296
-A INPUT -m state --state NEW -p tcp -s 1.0.0.0/8 -j ACCEPT
297
-A INPUT -m state --state NEW -p tcp -s 101.0.0.0/8 -j ACCEPT
298
-A INPUT -m state --state NEW -p tcp -s 103.0.0.0/8 -j ACCEPT
299
300
301
302
-A INPUT -m state --state NEW -p tcp -s 64.0.0.0/8 -j ACCEPT
303
-A INPUT -m state --state NEW -p tcp -s 76.0.0.0/8 -j ACCEPT
304
```
305
306
ちなみに、以下のコマンドで登録したエントリー毎に通信量が見れます。
307
308
```
309
# iptables -nvL
310
```
311
312
## オレオレ証明書を作りなおす
313
314
初期導入時の証明書は、数ヶ月で期限が切れるみたいなので、作り直します。
315
なぜオレオレ証明書を作るかというと、単にhttps通信で通信路を暗号化したいがためです。
316
オレオレなので、fish.minidns.netが、本当に本物のfish.minidns.netだという証明にはならないんですが、まぁ、ほとんど自分用のサイトなので、気にしません。
317
318
何も考えず呪文のように以下を入力すると、オレオレ証明書の生成から適用まで完了します。
319
320
```
321
# openssl genrsa 2048 > localhost.key
322
# openssl req -new -key localhost.key > localhost.csr
323
  (対話形式で色々入力するけど、オレオレなので、まぁ適当でも)
324
# openssl x509 -days 3650 -req -signkey localhost.key < localhost.csr > localhost.crt
325
# chmod go-wrx localhost.???
326
# cd /etc/pki/tls/certs/
327
# mv -i localhost.crt localhost.crt.org
328
# mv -i [新たに作ったやつのPATH]/localhost.crt ./
329
# cd /etc/pki/tls/private
330
# mv -i localhost.key localhost.key.org
331
# mv -i [新たに作ったやつのPATH]/localhost.key ./
332
# service  httpd restart
333
```
334
335
## Let's Encrypt サーバー証明書の取得と自動更新設定
336
337
[Let's Encrypt](https://letsencrypt.org/)というサービスを利用することで、自分が所有しているドメインのSSL/TLSサーバー証明書を、無料で発行できるようになりました。
338
上記、オレオレ証明書を作りなおす代わりに利用できます。この証明書だとブラウザで警告は出ません。
339
340
### Let's Encrypt インストール
341
342
以下で証明書の作成まで出来ます。
343
344
```
345
# cd /root
346
# git clone https://github.com/letsencrypt/letsencrypt
347
# cd letsencrypt/
348
# ./letsencrypt-auto --help
349
# ./letsencrypt-auto certonly --webroot -w /var/www/html -d example.com -m sample@example.com --agree-tos
350
```
351
352
オプション
353
354
```
355
certonly
356
 証明書の取得のみを行います。
357
358
--webroot
359
 ApacheなどWEBサーバのドキュメントルートに、認証用ファイルを生成します。
360
361
-w
362
 ドキュメントルートのパスを指定します。Apacheの場合は、DocumentRoot で指定しているパスです。
363
364
-d
365
 証明書を取得するドメイン名を指定します。Apacheの場合は、ServerName で指定しているドメイン名です。
366
367
-m
368
 ご自分のメールアドレスを指定します。なにかトラブルがあった場合などに Let's Encrypt との連絡用に使用されます。
369
370
--agree-tos
371
 Let's Encrypt の利用規約に同意します。
372
```
373
374
エラーが無ければ、以下に作られています。
375
376
証明書
377
378
```
379
/etc/letsencrypt/live/<ドメイン名>/cert.pem
380
```
381
382
証明書+中間CA証明書
383
384
```
385
/etc/letsencrypt/live/<ドメイン名>/fullchain.pem
386
```
387
388
秘密鍵
389
390
```
391
/etc/letsencrypt/live/<ドメイン名>/privkey.pem
392
```
393
394
中間CA証明書
395
396
```
397
/etc/letsencrypt/live/<ドメイン名>/chain.pem
398
```
399
400
### Apacheでの設定
401
402
Apacheの定義を修正します。通常、/etc/httpd/conf.d/ に格納されていますが、環境によって異なったり、
403
定義の中にinclude文があり、その先に記述されていたりしますので、注意が必要です。
404
405
ssl.conf や redmine-ssl.conf 等
406
407
```
408
- SSLCertificateFile    /etc/pki/tls/certs/localhost.crt
409
- SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
410
+ SSLCertificateFile      /etc/letsencrypt/live/fish.minidns.net/cert.pem
411
+ SSLCertificateKeyFile   /etc/letsencrypt/live/fish.minidns.net/privkey.pem
412
+ SSLCertificateChainFile /etc/letsencrypt/live/fish.minidns.net/chain.pem
413
```
414
415
Apacheを再起動して、定義を反映します。
416
417
```
418
# service httpd restart
419
```
420
421
### 暗号化方式の制限
422
423
いくつか暗号化方式で脆弱性が発見されているので、脆弱性のある暗号化方式で通信しないようにします。
424
425
ssl.conf や redmine-ssl.conf 等
426
427
```
428
+ SSLProtocol all -SSLv2 -SSLv3
429
+ SSLCipherSuite EECDH+HIGH:EDH+HIGH:HIGH:MEDIUM:+3DES:!ADH:!RC4:!MD5:!aNULL:!eNULL:!SSLv2:!LOW:!EXP:!PSK:!SRP:!DSS:!KRB5
430
```
431
432
Apacheを再起動して、定義を反映します。
433
434
```
435
# service httpd restart
436
```
437
438
439
### 証明書の更新
440
441
[Let's Encrypt](https://letsencrypt.org/)の証明書の有効期限は90日間になります。
442
証明書が切れる前に、再度、以下のコマンドで更新が必要です。
443
444
```
445
# cd /root/letsencrypt
446
# ./letsencrypt-auto certonly --webroot -w /var/www/html -d example.com --renew-by-default
447
# service httpd restart
448
```
449
450
cron等に登録しておくと良いでしょう。
451
452
### 更新情報メモ
453
454
letsencrypt-auto が certbot-auto になった
455
http://blog.n-z.jp/blog/2016-05-13-letsencrypt-certbot.html
456
457
なのでこんな感じの実行になる
458
459
```
460
# cd  /root/certbot
461
# ./certbot-auto renew --force-renew
462
# service httpd restart
463
```
464
465
ちなみに、cronにはこんな感じのシェルスクリプトが毎日動くように登録している
466
467
>なんかね、、certbot-autoがタイムアウト終了する時が多くて、これならダメでも次の日リトライしてくれる
468
469
```bash
470
# SSLサーバ証明書の有効期限残り日数が60日を切ったら実行する
471
VALID=$(/root/certbot/certbot-auto certificates|grep -o "VALID:.*"|cut -d' ' -f2)
472
if [ "${VALID}" -lt 60 ]
473
then
474
  # ここにcertbot-autoを実行するシェルスクリプト
475
fi
476
```
477
478
### GetSSLへ乗り換え
479
480
certbot-autoがタイムアウトするようになってしまった。原因が判然としないが、既知の問題のようで、かつ解決していないらしい。
481
しょうがないので、代替コマンドを探した。
482
483
ACME クライアント実装
484
https://letsencrypt.org/ja/docs/client-options/
485
486
> シェルススクリプト製のGetSSLがよさそうなので、乗り換えることにしました。
487
488
GetSSLのインストール
489
490
```
491
# curl --silent https://raw.githubusercontent.com/srvrco/getssl/master/getssl > getssl
492
# chmod 700 getssl
493
# ./getssl -c raintrees.net
494
```
495
496
/root/.getssl/getssl.cfg の修正
497
498
```
499
- CA="https://acme-staging-v02.api.letsencrypt.org"
500
+ #CA="https://acme-staging-v02.api.letsencrypt.org"
501
- #CA="https://acme-v02.api.letsencrypt.org"
502
+ CA="https://acme-v02.api.letsencrypt.org"
503
+ ACCOUNT_EMAIL="yourname@example.com"
504
```
505
506
/root/.getssl/raintrees.net/getssl.cfg の修正
507
508
```
509
+ ACL=('/opt/alminium/public/.well-known/acme-challenge')
510
```
511
512
証明書を取得
513
514
```
515
# ./getssl raintrees.net
516
```
517
518
配置先の元からあるシンボリックリンクがあればリンクを削除する
519
520
```
521
# cd /etc/letsencrypt/live/raintrees.net/
522
# unlink cert.pem
523
# unlink privkey.pem
524
# unlink chain.pem
525
# unlink fullchain.crt
526
```
527
528
サーバ証明書の配置
529
530
```
531
# cd /etc/letsencrypt/live/raintrees.net/
532
# cp /root/.getssl/raintrees.net/raintrees.net.crt ./cert.pem
533
# cp /root/.getssl/raintrees.net/raintrees.net.key ./privkey.pem
534
# cp /root/.getssl/raintrees.net/chain.crt ./chain.pem
535
# cp /root/.getssl/raintrees.net/fullchain.crt ./fullchain.pem
536
# chmod 644 cert.pem privkey.pem chain.pem fullchain.pem
537
```
538
539
Apacheを再起動して、定義を反映
540
541
```
542
# /sbin/service httpd restart
543
```
544
545
546
ちなみにcertbot-autoで証明書の有効期限を確認する仕組みから変更した
547
cronでこんな感じのシェルスクリプトが毎日動くように登録している
548
549
```bash
550
# SSLサーバ証明書の有効期限残り日数が30日を切ったら実行する
551
VALID=$(openssl s_client -connect 任意のドメイン:443 -servername 任意のドメイン < /dev/null 2> /dev/null | openssl x509 -noout -enddate|awk -F= '{print $2}'|date -d "$(cat -)" '+%s'|echo '(' $(cat) - $(date '+%s') ')/(60*60*24)'|bc)
552
if [ "${VALID}" -lt 30 ]
553
then
554
  # ここにgetsslを実行して証明書を所定の位置に配置するシェルスクリプト
555
fi
556
```
557
558
## Memo
559
560
ServersMan@VPS 「ServersMan@VPS」を使ってみました。設定方法やさまざまな機能の使い方・設定などを紹介しています。
561
http://webkaru.net/vps/cat/review/serversman/
562
563
ほのかなレンタルサーバ比較 レンタルサーバ講座 ServersMan@VPS
564
http://hikaku-server.com/rentalserver/
565
566
CentOSでサーバー公開するためのセキュリティ設定メモ
567
http://qiita.com/narumi888/items/179048afb48f64f45c6e
568
569
Serversman@VPSのネットワーク不調・TCP接続失敗 
570
http://causeless.hatenablog.jp/entry/2015/06/21/205731
571
572
DTI の ServersMan@VPS には変な制限がある
573
http://www.makotoiwasaki.com/2014/11/dti-serversmanvps.html
574
575
Let's Encrypt サーバー証明書の取得と自動更新設定メモ
576
https://blog.apar.jp/linux/3619/
577
578
侵害有無を簡易に調査する Linux コマンド15選。侵害を受けたかもしれない Linux マシンを調べるときの参考
579
https://www.linkedin.com/pulse/quick-set-anomalies-look-identify-compromised-linux-system-b-/