プロジェクト

全般

プロフィール

ServersMan » 履歴 » バージョン 1

kanata, 2025/04/13 16:32

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