2017年02月03日

このエントリーをはてなブックマークに追加
以前以下の通り記事を書いていました。
FTP の代わりに SFTP を利用する: 2016年06月21日

このとき、時間がなかったりでちゃんと検証していませんでした。
ということで、最近改めて設定したのでめも。

・要件
ログインは証明書を利用
1つのWebサイトについて、1社1名で更新する。
アカウント発行は1名ごと。
自分の担当Webサイト以外は見えないようにする
ディレクトリの移動は自分に関係のあるところだけ

こんな感じです。
chroot でも様々な方法があり、シンボリック方式もいいのですが、上下階層で関連ディレクトリをまとめる必要があります。
例) document root -> /home/www , ユーザーディレクトリ -> /home/www/chroot

これではなんとなく気持ち悪いなぁと思っていました。
参考
openssh chrootかつsftpだけ利用できる環境を構築する
特定のユーザのみSFTPでchrootする

さらに調べてみると、mount --bind という方式が便利のようでした。
そしてとても詳しく書いてあるサイトが。
参考
SFTPのchroot設定方法〜実践向け〜
SFTP chroot

日本語サイトばかり調べていたのですが、とりあえず標準的な手法はないのかと、海外サイトも含めて調べていたら、この方法を見つけました。そしてその後日本語の解説を見つけたのです。すばらしいですね。

上記の参考サイトの通りですが以下の方法で作業。

・ユーザーの作成、パスワード付与
useradd
passwd

・グループの編集
※vipwを利用して、上記で作成したユーザーのグループをSFTPグループに所属させます。usermod -g <グループ名>でも同じようです。なおその際、homeフォルダについては、デフォルトのままなので /home/です。(証明書ログインのときには、authorized_keysを参照するので、この方が都合がいいようです。)

・証明書ログインのために authorized_keys の設定
mkdir /home//.ssh
chown . /home//.ssh
chmod 600 /home//.ssh

vi /home//.ssh/authorized_keys
※上記ファイルに公開鍵を記載

所属などの確認
id

・chroot 用のユーザーディレクトリの作成
mkdir /home/chroot-home/
※/home/chroot-home/ にユーザーフォルダは集約することにしました。なお、ユーザー名のフォルダを作成しておかないと、ログイン時にエラーとなってはじかれます。

・マウント用ディレクトリの作成
mkdir /home/chroot-home//

・sshd サービスの設定
# vi /etc/ssh/sshd_config
Match User
ChrootDirectory /home/chroot-home/%u
ForceCommand internal-sftp

# service sshd restart

・まずは手動でマウント
mount --bind /var/www/ /home/chroot-home//

・SFTPクライアントからログイン
※ログインすると / ディレクトリ内に、 というフォルダがあることが確認できました。
また、上記フォルダに対して、問題無く書き込みができました。


・問題が無ければfstabに追記
# vi /etc/fstab
/var/www/ /home/chroot-home// none bind

以上で、証明書ログインを行いつつ、chroot を行うことができました。

気になる点としては、mount をするので、ユーザー数が多いときにはとんでもないマウント数になってしまうように思われます。

stock_value at 17:44|この記事のURLComments(0)TrackBack(0)技術 

2017年02月02日

このエントリーをはてなブックマークに追加
以前、サーバーに remi レポジトリをインストールしました。
そして必要なパッケージなどをインストールし、利用していました。

しかし、yum コマンドを実行したときに、 remi が関係無いときでもパッケージを読み込むため、非常に遅いのです。

yum 実行時のエラー。

remi-safe | 2.9 kB 00:00
http://mirror.innosol.asia/remi/enterprise/6/safe/x86_64/repodata/ae86b8b87743412baf3f009fb030665c8185fe1756d34022673699b983eec503-primary.sqlite.bz2: [Errno 12] Timeout on http://mirror.innosol.asia/remi/enterprise/6/safe/x86_64/repodata/ae86b8b87743412baf3f009fb030665c8185fe1756d34022673699b983eec503-primary.sqlite.bz2: (28, 'Operation too slow. Less than 1 bytes/sec transfered the last 30 seconds')
Trying other mirror.

Operation too slow とてもイヤな言葉ですね。

僕の環境では、参考サイトの通り fastestmirror.conf から、 include_only=.jp にすれば解決しました。
# vi /etc/yum/pluginconf.d/fastestmirror.conf
追記
include_only=.jp

参考
yumのダウンロードが遅い事象に対処する
yumで使用するミラーサイトの国を限定
stock_value at 12:10|この記事のURLComments(0)TrackBack(0)技術 

2017年02月01日

このエントリーをはてなブックマークに追加
昨年(2016年)の10月ごろ、僕が構築したサーバーでCakePHPの動作について色々問合せをうけ、検証を行いました。

2016年10月04日:CakePHP 2.X をインストールしました。

今回もまた僕が構築するサーバーで、 CakePHP を動作させるようです。そして今回の構成はロードバランサー配下となります。
すると、よくありがちなセッションの保持で問題になりました。ということで、 CakePHP のセッションを memcahed で管理したいと思います。

設定は非常に簡単で以下の通り。
core.php 内の、以下の行について、defaults を php から cache に変更する。

Configure::write('Session', array(
/*'defaults' => 'php'*/
'defaults' => 'cache'
));


ちなみに、core.php 内にはキャッシュの設定(Cache::config)もあり、そこでも Memcached を指定できるようです。セッションについては、上記だけで大丈夫なのかな?僕の環境では両方 memcached になっていました。

※前回の繰り返しになりますが、僕はサーバーの構築のみで、動作するアプリについての調査は必要に応じて行いますがやっぱり苦手です。

stock_value at 11:58|この記事のURLComments(0)TrackBack(0)技術 

2017年01月31日

このエントリーをはてなブックマークに追加
最近、通信ログの取得が重要視される場面がたまにあります。
個人的には、ログの取得は馬鹿にできないほどの負荷になったり、保存先のストレージサイズによってはすぐに枯渇したり。
ログを解析するには結構な手間が必要だったりと、技術的にクリアするべきこともたくさんあるように思っています。

しかしながら、たくさんの期間、なるべく詳細なログが取得できるのは素晴らしいですよね。

そして現実的な解決策としてはsyslogを利用することです。これを利用できる環境であれば、ストレージ容量もあまり心配しなくていいでしょうし、DBなどで管理しているのであれば、管理も検索もラクです。

Yamaha単体の場合。
最近のYamahaでは外部USBメモリにログを保存することができます。そしてそのUSBメモリの容量も結構大きいものまでいけるみたいですね。・・・動作確認のメモリを見ると、8Gとかっぽいのがありました。

参考
外部メモリファイルコピー機能

external-memory syslog filename usb1:rt_syslog.log

ローテートコマンドもあるようなのでこれも指定しておいた方がいいと思います。
stock_value at 12:15|この記事のURLComments(0)TrackBack(0)技術 

2017年01月30日

このエントリーをはてなブックマークに追加
手順は以下の参考サイトがとても詳しいです!
IISでLet's Encrypt を利用してSSLサイトを構築する (letsencrypt-win-simple クライアントを利用)

ポイントとしては、マニュアルで作成すること、拡張子の無いファイルを参照させようとするので、 web.config の作成が必要なことです。

僕の手順。
コマンドプロンプト
# cd D:\SSL_tool\letsencrypt-win-simple.V1.9.1

※引数なしで実行
# letsencrypt.exe
-- 略 --
Scanning IIS Site Bindings for Hosts
1: IIS XXXX (C:\inetpub\wwwroot\XXXX)

W: Generate a certificate via WebDav and install it manually.
F: Generate a certificate via FTP/ FTPS and install it manually.
M: Generate a certificate manually.
A: Get certificates for all hosts
Q: Quit
Which host do you want to get a certificate for: m

サイトが一つ見つかりました。しかしこれは、Default ではない別のサイトでした。今回はDefaultでホストしているサイトをSSL化したいので、Mを選択しました。

Enter a host name: XXXXXXXX
Enter a site path (the web root of the host for http authentication): C:\inetpub\wwwroot\

デフォルトでは wwwroot ディレクトリを公開対象としているので、上記の通り入力しました。 hostname はいわゆるコモンネームです。

******************************************************************************
The ACME server was probably unable to reach http://XXXXXXXX/.well-kn
own/acme-challenge/XXXXHCTOStd6M50jYG91I

Check in a browser to see if the answer file is being served correctly.

******************************************************************************
参考サイトと同様にエラーが出ました。これは今回のコマンドで作成されたファイルにwebからアクセスできないという内容のようです。
原因は拡張子がないため、IISのデフォルト設定では拒否されてしまいます。
.well-known/acme-challenge/ フォルダにアクセスし、web.config を作成します。記載内容については、一番最初に挙げた参考サイトの通りです。
以下の行が重要なようです。


IISの管理画面からでも可能です。acme-challenge のフォルダまでクリックし、「MIME の種類」をクリック。操作から追加をクリックし、ファイル名の拡張子に "." ドットを入力。MIMEの種類に text/plain と入力します。

上記でエラーが解決したので、もう一度コマンドラインの最初からやりなおしです・・。
とにかくこれでうまくいきました。最後にタスクスケジューラーのユーザー名などを聞かれるので、そのまま入力します。以下のコマンドが毎日9時で登録されていました。
[フルパス]letsencrypt.exe --renew --baseuri "https://acme-v01.api.letsencrypt.org/"

以下のフォルダを開いて確認します。
Saving Certificate to C:\Users\[USERNAME]\AppData\Roaming\letsencrypt-win-simple\httpsacme-v01.api.letsencrypt.org\

IISのサーバー証明書にも追加されていたので、バインドから修正を行うとすぐに利用可能でした。


※その他の引数です。


--baseuri (Default: https://acme-v01.api.letsencrypt.org/) The address of the ACME server to use.
--accepttos Accept the terms of service.
--renew Check for renewals.
--test Overrides BaseUri setting to
https://acme-staging.api.letsencrypt.org/
--manualhost A host name to manually get a certificate for.
--webroot must also be set.
--webroot (Default: %SystemDrive%\inetpub\wwwroot) A web root for
the manual host name for authentication.
--script A script for installation of non IIS Plugin.
--scriptparameters Parameters for the script for installation of non IIS
Plugin.
--centralsslstore Path for Centralized Certificate Store (This enables
Centralized SSL). Ex. \\storage\central_ssl\
--hidehttps Hide sites that have existing HTTPS bindings
--san Certificates per site instead of per host
--keepexisting Keep existing HTTPS bindings, and certificates
--help Display this help screen.
--version Display version information.

stock_value at 11:30|この記事のURLComments(0)TrackBack(0)技術 

2017年01月29日

このエントリーをはてなブックマークに追加
MySQLではレプリケーション機能があります。
マスター / スレーブですね。

ということで、以下の方法で構築しました。

1. マスター / スレーブで Server-id の設定
マスター: server-id=1
スレーブ: server-id=2

マスター側では一緒に log-bin も入れておきます。
log-bin

2. レプリケーションユーザーの作成(マスター)
phpmyadmin で行ってしまいました。

select Host, User, Password from mysql.user;
+-------------+------+-------------------------------------------+
| Host | User | Password |
+-------------+------+-------------------------------------------+
| X.X.X.% | repl | XXXX

とりあえず、/24 の範囲で許可しておきます。

3. データのコピーを行う
・マスター側作業
テーブルをロックし、更新されないようにする
FLUSH TABLES WITH READ LOCK;

ログのポジションを確認する(Change Masterコマンドで利用します)
SHOW MASTER STATUS;

バックアップの取得(パスワードなどは適宜指定)
# mysqldump --all-databases --master-data > dbdump.db

テーブルのロックを解除する
mysql> UNLOCK TABLES;

上記で取得したバックアップファイルを、スレーブ側にコピー。

・スレーブ側作業
データインポート
mysql < fulldb.dump

以下のコマンドを実行し、マスターに接続するように設定する
CHANGE MASTER TO
MASTER_HOST='X.X.X.X',
MASTER_USER='repl',
MASTER_PASSWORD='XXXXXXX',
MASTER_LOG_FILE='mysqld-bin.000001',
MASTER_LOG_POS=344; ※上記で確認したログのポジション

スレーブの開始
mysql> START SLAVE;

状態の確認
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: X.X.X.X
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysqld-bin.000001
Read_Master_Log_Pos: 1661
Relay_Log_File: mysqld-relay-bin.000005
Relay_Log_Pos: 420
Relay_Master_Log_File: mysqld-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:

とりあえず以下の行が出力されていればOKのようです。
Slave_IO_State: Waiting for master to send event


参考
MySQL レプリケーションの設定
MySQL入門 レプリケーション編
stock_value at 15:05|この記事のURLComments(0)TrackBack(0)技術