hirosanote’s blog

検証環境の構築手順やネットワーク機器のテスト結果、関連する事について記載します。このブログは個人で行っており、所属する会社とは関係ありません。

SAMLテスト環境の構築手順

SimpleSAMLphpを使用し、SAMLのテスト環境をローカルに構築する手順を記載します。以下のページを参考にしました。
https://siblog.seiwatec.co.jp/?p=344

このブログでは、このページを見ればインストールが成功し、動作確認できることを目指しています。SimpleSAMLphpをインストールするための準備および各設定も大変でしたので、手順を記載します。

SAMLについてほんの少しだけ解説を加えます。

SAML : Security Assertion Markup Language サムルと読む。

IDP : Identify Provider 認証情報を提供
SP : Service Provider 認証情報を利用


環境
Linux CentOS7.5
インストールメディア : CentOS-7-x86_64-Minimal-1804.iso
CentOS7.5の場合は、予めOpenSSLがインストールされているため、このバージョンを使用します。

IDP ip address : 192.168.0.104
SP ip address : 192.168.0.105


1. 各設定及び、必要なモジュールのインストール
IDP, SPの両方に以下を行います。

テスト環境のため、トラブルを少なくするためにSELINUXFireWallを無効にします。

vi /etc/selinux/config
SELINUX=disabled <-- 変更
systemctl disable firewalld
systemctl stop firewalld


Apacheをインストールします。

yum -y install httpd-devel
yum -y install mod_ssl


PHPをインストールします。

yum -y install php
yum -y install php-devel
yum -y install php-pdo
yum -y install php-mysqlnd
yum -y install php-mbstring
yum -y install php-gd
yum -y install php-pear


Apacheを起動します。

systemctl start httpd
systemctl enable httpd


ブラウザから、HTTPSにて接続しページが表示されることを確認します。

https://192.168.0.104
https://192.168.0.105


SimpleSAMLphpのインストール
以下のURLより、最新のモジュールをダウンロードします。
https://simplesamlphp.org/download

winscp等で、/varへダウンロードしたファイルをアップロードします。

アップロードしたファイルを/var/simplesamlphp に展開します。

cd /var
tar xzf simplesamlphp-1.16.1.tar.gz
mv simplesamlphp-1.16.1 simplesamlphp
chmod 755 /var/simplesamlphp/www


Apacheのhttp.confの一番最後に、以下を追加します。

cd /etc/httpd/conf
vi httpd.conf

Alias /simplesaml /var/simplesamlphp/www
<Directory "/var/simplesamlphp/www">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>


サービスを再起動します。

service httpd restart


設定画面へアクセス出来ることを確認します。
https://saml.server.ip.address/simplesaml/
f:id:hirosanote:20180915150737p:plain



IDPの設定
IDPのインスタンス 192.168.0.104にSSHでログインします。

config.phpの各設定を行います。

vi /var/simplesamlphp/config/config.php


adminユーザーのパスワードを変更します。変更しないと、ログインできません。

'auth.adminpassword' => '123456',


IDPモジュールを有効化します。

'enable.saml20-idp' => true,
'enable.shib13-idp' => true,

config.phpを保存して閉じます。


サンプルユーザーを作成します。

touch /var/simplesamlphp/modules/exampleauth/enable
cd /var/simplesamlphp/config/
vi authsources.php
ファイルの一番最後にある「);」を削除します。

f:id:hirosanote:20180916164702p:plain
以下を追加します。

'example-userpass' => array(
    'exampleauth:UserPass',
    'user1:test1' => array(
        'uid' => array('user1'),
        'eduPersonAffiliation' => array('member', 'developer'),
    ),
    'user2:test2' => array(
        'uid' => array('user2'),
        'eduPersonAffiliation' => array('member', 'admin'),
    ),
 ),

);


自己証明書を作成します。

cd /var/simplesamlphp/cert
openssl req -newkey rsa:2048 -new -x509 -days 3652 -nodes -out server.crt -keyout server.pem

Generating a 2048 bit RSA private key
..............................................................................................+++
.............+++
writing new private key to 'server.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:testidp
Locality Name (eg, city) [Default City]:testidp
Organization Name (eg, company) [Default Company Ltd]:testidp
Organizational Unit Name (eg, section) []:testidp
Common Name (eg, your name or your server's hostname) []:testidp
Email Address []:


生成した証明書とキーファイル名が、指定されていることを確認します。

vi /var/simplesamlphp/metadata/saml20-idp-hosted.php
'privatekey' => 'server.pem',
'certificate' => 'server.crt',

vi /var/simplesamlphp/metadata/shib13-idp-hosted.php
'privatekey' => 'server.pem',
'certificate' => 'server.crt',


SPの設定
SPのインスタンス 192.168.0.105にSSHでログインします。

config.phpの各設定を行います。

vi /var/simplesamlphp/config/config.php


adminユーザーのパスワードを変更します。変更しないと、ログインできません。

'auth.adminpassword' => '123456',


自己証明書を作成します。

cd /var/simplesamlphp/cert
openssl req -newkey rsa:2048 -new -x509 -days 3652 -nodes -out server.crt -keyout server.pem
Generating a 2048 bit RSA private key
....................+++
............................................+++
writing new private key to 'server.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:testsp
Locality Name (eg, city) [Default City]:testsp
Organization Name (eg, company) [Default Company Ltd]:testsp
Organizational Unit Name (eg, section) []:testsp
Common Name (eg, your name or your server's hostname) []:testsp
Email Address []:


生成した証明書とキーファイル名が、指定されていることを確認します。

vi /var/simplesamlphp/metadata/saml20-idp-hosted.php
'privatekey' => 'server.pem',
'certificate' => 'server.crt',

vi /var/simplesamlphp/metadata/shib13-idp-hosted.php
'privatekey' => 'server.pem',
'certificate' => 'server.crt',


IDPを指定します。

vi /var/simplesamlphp/config/authsources.php

以下の箇所に追加します。
f:id:hirosanote:20180916183823p:plain

 'idp' => 'https://192.168.0.104/simplesaml/shib13/idp/metadata.php',

f:id:hirosanote:20180917180145p:plain



IDPメタデータの設定
IDPにSPのメタデータを登録します。

SP側の設定ページを開きます。
https://192.168.0.105/simplesaml

[連携] -> [SAML 2.0 SPメタデータ] -> [メタデータの表示]をクリックします。
f:id:hirosanote:20180917161602p:plain


表示されたメタデータクリップボードにコピーします。
f:id:hirosanote:20180917162056p:plain


IDP側の設定ページを開きます。
https://192.168.0.104/simplesaml


管理者でログインします。

[連携] -> [ツール] -> [XML を SimpleSAMLphpメタデータに変換]をクリックします。
f:id:hirosanote:20180917181545p:plain


クリップボードにコピーしたSPのXMLデータをペーストします。
ペースト後、[パース]をクリックします。
f:id:hirosanote:20180917163951p:plain


変換されたメタデータshib13-sp-remoteをクリップボードにコピーします。
f:id:hirosanote:20180917164434p:plain


IDP側の以下のファイルの一番最後にペーストします。

vi /var/simplesamlphp/metadata/shib13-sp-remote.php


変換されたメタデータsaml20-sp-remoteをクリップボードへコピーします。
f:id:hirosanote:20180917165055p:plain


IDP側の以下のファイルの一番最後にペーストします。

vi /var/simplesamlphp/metadata/saml20-sp-remote.php


連携タブより、設定が正しく表示されていることを確認します。
f:id:hirosanote:20180917182548p:plain



SPメタデータの設定
SPにIDPのメタデータを登録します。

IDP側の設定ページを開きます。
https://192.168.0.104/simplesaml


[連携] -> [SAML 2.0 IdPメタデータ] -> [メタデータの表示]をクリックします。
f:id:hirosanote:20180917183322p:plain


メタデータ SAML 2.0 用のメタデータXMLフォーマットをクリップボードにコピーします。
f:id:hirosanote:20180917190711p:plain


SP側の設定ページを開きます。
https://192.168.0.105/simplesaml

管理者でログインします。


[連携] -> [ XML を SimpleSAMLphpメタデータに変換]をクリックします。
f:id:hirosanote:20180917191004p:plain


IDPのメタデータをペーストし[パース]をクリックします。
f:id:hirosanote:20180917191243p:plain


変換されたメタデータsaml20-idp-remoteをクリップボードにコピーします。
f:id:hirosanote:20180917191715p:plain


SP側192.168.0.105にSSHでログインします。
以下のファイルの一番最後に変換されたメタデータsaml20-idp-remoteをペーストします。

vi /var/simplesamlphp/metadata/saml20-idp-remote.php


IDP側の設定ページを開きます。
https://192.168.0.104/simplesaml


[連携] -> [Shib 1.3 IdPメタデータ] -> [メタデータの表示]をクリックします。
f:id:hirosanote:20180917193306p:plain


メタデータ Shib 1.3 IdP 用のメタデータXMLフォーマットをクリップボードにコピーします。
f:id:hirosanote:20180917195829p:plain


SP側の設定ページを開きます。
https://192.168.0.105/simplesaml

管理者でログインします。


[連携] -> [ XML を SimpleSAMLphpメタデータに変換]をクリックします。

IDPのメタデータをペーストし[パース]をクリックします。

変換されたメタデータshib13-idp-remoteをクリップボードにコピーします。

SP側192.168.0.105にSSHでログインします。
以下のファイルの一番最後に変換されたメタデータshib13-idp-remoteをペーストします。

vi /var/simplesamlphp/metadata/shib13-idp-remote.php


連携タブより、設定が正しく表示されていることを確認します。
f:id:hirosanote:20180917200621p:plain



動作テスト
SP側の設定ページを開きます。
https://192.168.0.105/simplesaml/


[認証] -> [ 設定されている認証元をテスト] をクリックします。
f:id:hirosanote:20180917201243p:plain


default-spをクリックします。
f:id:hirosanote:20180917201404p:plain


[選択]をクリックします。
f:id:hirosanote:20180917201630p:plain


IDPの192.168.0.104へリダイレクトされたことを確認します。テストアカウントを入力し、[ログイン]をクリックします。
ユーザ名 : user1
パスワード : test1
f:id:hirosanote:20180917202307p:plain


ログインの結果が表示されれば、OKです。
f:id:hirosanote:20180917202432p:plain

CentOS7にphpMyFAQをインストール

このブログのモットーは、このページを見ればインストールが成功し、動作することを目指しています。
phpMyFAQのインストールを試みたところ、4 ~ 5サイト参照してやっと出来ました。
動作に成功した手順を、以下に記載します。

1. 使用したCentOS7 インストールメディア
CentOS-7-x86_64-Minimal-1511.iso


2. CentOS7インストール後の設定

vi /etc/selinux/config
SELINUX=disabled  <- disabledに設定
  • reboot
reboot


3. PHP5.6, Apache, MariaDB, wgetのインストール及び動作確認

#各モジュールのインストール
yum install wget mariadb-server mariadb httpd
yum install epel-release
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
yum install --enablerepo=remi-php56 php php-gd php-pecl-jsonc php-common php-mbstring php-xml php-mysql

#php.iniファイルの一番最後に以下の設定を追加
vi /etc/php.ini
register_globals = off
safe_mode = off

#Apacheの自動起動及び起動
systemctl enable httpd.service
systemctl start httpd.service

#テスト用ページの作成
echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php

ブラウザから、作成したテスト用ページにアクセスし、phpの情報が表示されることを確認します。
http://your.server.ip.address/phpinfo.php


4. MariaDB自動起動設定と起動

systemctl enable mariadb.service
systemctl start mariadb.service


5. MariaDBの各設定

[root@localhost ~]# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):  <- Enterキーを押す

OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] Y  <- Yを入力

New password:  <- 設定するパスワードを入力
Re-enter new password:  <- 再入力

Password updated successfully!
Reloading privilege tables..
 ... Success!

By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n]  <- Yを入力
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n]  <- Yを入力

 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n]  <- Yを入力

 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n]  <- Yを入力

... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!
[root@localhost ~]#


6. DBの作成

mysql -u root -p
Enter password:  <- 設定したパスワードを入力

MariaDB [(none)]>create database faqdb;
MariaDB [(none)]>GRANT ALL ON faqdb.* TO faqusr@localhost IDENTIFIED BY '******';  <- ******はpasswordを設定
MariaDB [(none)]>flush privileges;
MariaDB [(none)]>exit;


7. phpMyFAQのインストール

phpMyFAQサイトより最新ファイルのダウンロードURLを確認します。

wget -c http://download.phpmyfaq.de/phpMyFAQ-2.9.10.tar.gz
tar xzvf phpMyFAQ-2.9.10.tar.gz

#必要なディレクトリの作成と権限を与えます。
mkdir phpmyfaq/attachments
mkdir phpmyfaq/data
mkdir phpmyfaq/images
chmod 775 phpmyfaq/attachments phpmyfaq/data phpmyfaq/images
chown -R apache.apache phpmyfaq/


8. phpMyFAQの初期設定
ブラウザより、初期設定画面へアクセスします。
http://your.server.ip.address/phpmyfaq

以下の設定を行います。
Database server: MariaDB 5.x
Database hostname: localhost
Database user: faqusr
Database password: ***** <- DB作成時に作成したパスワード
Database name: faqdb

Default language: Japanese
Permission level: Basic
Your Name: <-- 名前を設定
Your email address: <- e-mailアドレスを設定
Your login name: <- ログイン名を設定
Your password: <- パスワードを設定
Retype password: <- パスワードを再入力

f:id:hirosanote:20180715155447p:plain

画面をスクロールし、"Click to install phpMyFAQ 2.9.10"をクリックします。
f:id:hirosanote:20180715155830p:plain

以下のメッセージが表示されます。
f:id:hirosanote:20180715160857p:plain


9. 動作確認
トップページへアクセスします。
http://your.server.ip.address/phpmyfaq

右上のログインをクリックし、登録したアカウントでログインできることを確認します。
f:id:hirosanote:20180715161331p:plain

ロードバランサーでSSLインターセプトし、SquidでSSLアクセスログを取得

Squidをプロキシで使用している場合、HTTP通信はドメイン名の他にディレクトリを含めたアクセスログを取得できますが、SSL通信はドメイン名しか取得できません。
例:https://ja.wikipedia.org/wiki/WordPress にアクセス
Squidのログ
01/Jul/2018:11:07:19 +0900 1499 192.168.0.43 TCP_TUNNEL/200 5608 CONNECT jp.wikipedia.org:443 - HIER_DIRECT/jp.wikipedia.org -

アクセス先のディレクトリが見えないため、正確なアクセスログが取得できず、URLフィルタを使用することが出来ません。
社内通信の全てのアクセスログを取得する必要があったため、HTTPSをHTTPへ変換してSquidに送り、Squidからインターネットへ送るときに再度HTTPS化することにしました。
最近のロードバランサーにはSSL通信をインターセプトして平文にした後、再度暗号化を行いインターネットへ通信する機能があります。ロードバランサーですので、Squidサーバーを複数台用意して負荷分散も行うことが出来ます。

メリット:
- ドメイン名の他にディレクトリも含めた完全なログを取得できる
- ドメイン単位ではなくディレクトリも含めてURLフィルタが可能
- プロキシサーバーの負荷分散
- 既存のデフォルトゲートウェイ機器をロードバランサーに入れ替えることで動作するので、クライアント側で大幅な設定変更が不要

ロードバランサーSSL通信をいったん横取りする必要があるため、アクセスするサイトの証明書はロードバランサーが発行します。自己証明書になるため、ロードバランサーが発行するルート証明書を各端末にインストールし、チェーンチェックを行えるようにしておく必要があります。
Quick (UDP SSL)はインターセプト出来ないため、ロードバランサーACLで、443/UDPをブロックします。クライアント側は、443/UDPが使用できない場合、443/TCPに自動で切り替えます。

アレイネットワークス社APVシリーズロードバランサーSSLインターセプト機能を使用して構築してみました。


構成図
f:id:hirosanote:20180701203346p:plain


環境
CentOS7 / Squid x 2
Array APV x 2
Router x 1


設定のポイント Squid
1. IPv4転送を有効にします。

echo "net.ipv4.ip_forward = 1" | tee /etc/sysctl.d/10-ipv4.conf
sysctl -p /etc/sysctl.d/10-ipv4.conf
sysctl net.ipv4.ip_forward

2. Squid設定に透過プロキシ、ロードバランサーSSLポート443からHTTPポート8080に変換した通信を許可、ログフォーマットを追加します。

vi /etc/squid/squid.conf
#宛先ポート番号の許可を追加
acl Safe_ports port 8080

#透過プロキシの設定
# Squid normally listens to port 3128
http_port 3128 transparent

#ログフォーマットを追加
logformat combined %tl %6tr %>a %Ss/%03Hs %<st %rm %ru %un %Sh/%<A %mt
access_log /var/log/squid/access.log combined

3. IPマスカレードを有効にし、ロードバランサーSSLポート443宛ての通信をHTTPポート8080に変換した通信と、HTTPポート80の通信をSquidのポート3128にフォワードします。

firewall-cmd --permanent --add-masquerade
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" forward-port port="80" protocol="tcp" to-port="3128" to-addr="192.168.21.1"'
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" forward-port port="8080" protocol="tcp" to-port="3128" to-addr="192.168.21.1"'


設定のポイント ロードバランサー Array APV
クライアント側のAPV
1. クライアントからのポート番号443のSSL通信をインターセプトします。

slb virtual tcps "sqvip" 0.0.0.0 443 noarp 0

2. 平文にしたHTTPトラフィックを宛先IPは変更せず、ポート番号を8080に変換してSquidサーバーへパケットを送り、負荷分散します。

slb real fwdip "sq01" 192.168.11.1 8080 10000 
slb real fwdip "sq02" 192.168.12.1 8080 10000 

3. SSL通信以外は、リンク分散機能でSquidへ送り、負荷分散します。

llb method outbound rr
llb link route "sq01" 192.168.11.1 1 0.0.0.0 0Mbps
llb link route "sq02" 192.168.12.1 1 0.0.0.0 0Mbps

インターネット側のAPV
平文にしたHTTPポート番号8080通信を受け取り、SSLに再暗号化とポート番号443に変換し、ルーターへパケットを送ります。

slb virtual tcp "sqvip" 0.0.0.0 8080 noarp 0
slb real tcps "router" 192.168.30.1 443 10000 icmp 3 3

HTTPポート8080以外の通信は、ルーティング設定に従ってルーターへ送られます。


設定のポイント クライアント
ロードバランサールート証明書RSA, ECCの両方をIEの信頼された証明書機関にインポートします。
f:id:hirosanote:20180701205707p:plain


動作の確認
サイトの証明書が、ロードバランサーが発行した証明書が使用されており、インポートしたルート証明書とチェーンチェックされていることを確認します。
f:id:hirosanote:20180701210218p:plain
f:id:hirosanote:20180701210858p:plain

Squidのログを確認し、ディレクトリまで取得できていることを確認します。
f:id:hirosanote:20180701211634p:plain


負荷の高いSSL処理をロードバランサー側が行い、Squidサーバーの負荷を軽減出来ることもメリットです。

Docker プライベートレジストリを構築する手順

Dockerのプライベートレジストリ ( リポジトリ )を構築するする手順を記載します。以下のサイトを参考および翻訳しました。サイト管理者には、翻訳しブログに掲載することの許可は得ています。
www.itzgeek.com

Dockerレジストリは、Dockerイメージを社内(組織内)に格納して配布するためのアプリケーションです。 Dockerには、Dockerハブと呼ばれる公開レジストリがあり、Dockerイメージを自由に保存できます。
しかし、Docker公開レジストリの問題は、アップロードしたイメージが一般公開されることです。 これは、イメージを構築するために長時間働いたときに貴方や貴方の組織が期待するものではありません。この問題を克服するために、プロジェクトのDockerレジストリを非公開に設定することで、貴方または貴方の組織だけがDockerイメージをそこに保存し、同僚に配布できるようにすることができます。

このテクニカルガイドでは、CentOS 7 / Ubuntu 16.04 / Fedora 27にDocker Private Registryを設定する方法について説明します。


インフラ
f:id:hirosanote:20180623185823p:plain

ホスト名 IPアドレス OS 目的
registry.itzgeek.local 192.168.12.10 CentOS 7 Dockerプライベートレジストリサーバーとして動作します。
build.itzgeek.local 192.168.12.20 Ubuntu 16.04 開発者がdockerファイルまたはdockerを使用してDockerイメージを作成し、それらのイメージをdockerプライベートレジストリサーバーにアップロードするDockerエンジンノードとして機能します。
deploy.itzgeek.local 192.168.12.30 Fedora27 プライベートレジストリサーバからダウンロードされた(プル)コンテナをデプロイするDockerエンジンノードとして動作します。

ノート:ここでは、混合(OS)環境を使ってデモンストレーションしています。 トラブルシューティングのために簡単な同種の環境だけを使用することをお勧めします。


前提条件
すべてのノードにDockerエンジンをインストールし、Dockerサービスが起動していることを確認してください。
以下を参考にして下さい。

CentOS 7にDockerをインストールする手順 - hirosanote’s blog
Ubuntu 16.04にDockerをインストールする手順 - hirosanote’s blog
Fedora 27にDockerをインストールする手順 - hirosanote’s blog

先に記載したホスト名を、各ノードに設定します。
先に記載したホスト名、IPアドレスを各ノードのhostsファイルに設定します。

# vi /etc/hosts


Dokerプライベートレジストリの設定
レジストリノードにログインし、Docker Hubからレジストリイメージを取得します。

[root@registry ~]# docker pull registry

プレーンまたはセキュアドッカーレジストリのどちらを使用するかを選択します。


プレーンドッカーレジストリ

[root@registry ~]# docker run -dit -p 5000:5000 --name registry registry


セキュアドカープライベートレジストリ
デフォルトでは、Dockerノードは、TLSを介した安全な接続を使用して、プライベートレジストリとの間でイメージをアップロードまたはダウンロードします。 CAによって署名されたTLS証明書、またはレジストリサーバーで自己署名されたTLS証明書を使用できます。
ここでは、Dockerレジストリを保護するために自己署名証明書を使用します。 次のコマンドを使用して自己署名証明書を作成しましょう。

[root@registry ~]# mkdir -p /certs
[root@registry ~]# openssl req -newkey rsa:2048 -nodes -sha256 -keyout /certs/ca.key -x509 -days 365 -out /certs/ca.crt
Generating a 2048 bit RSA private key
......................+++
..........................+++
writing new private key to '/certs/ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:test
Locality Name (eg, city) [Default City]:test
Organization Name (eg, company) [Default Company Ltd]:test
Organizational Unit Name (eg, section) []:test
Common Name (eg, your name or your server's hostname) []:registry.itzgeek.local
Email Address []:admin@itzgeek.local
[root@registry ~]#

"registry.itzgeek.local"をあなたのレジストリサーバーのFQDNに置き換えます。
生成された証明書 "ca.crt"は、この証明書を信頼するためにすべてのビルド/デプロイメントノードに配置する必要があります。

Dockerレジストリコンテナを証明書情報を使用して開始します。

docker run -d -p 5000:5000 --restart=always --name registry -v /certs:/certs -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/ca.crt -e REGISTRY_HTTP_TLS_KEY=/certs/ca.key registry

これで、"registry.itzgeek.local"で実行されている"registry"という名前のレジストリ・サーバー・コンテナが作成されました。

[root@registry ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
45a3531aad19        registry            "/entrypoint.sh /etc…"   2 minutes ago       Up 2 minutes        0.0.0.0:5000->5000/tcp   registry


FireWall
Dockerレジストリがネットワーク外で利用できるようにするには、ファイアウォールの次のポートを開く必要があります(build.itzgeek.local / deploy.itzgeek.localへの通信)

Dockerレジストリが、CentOS7, Fedora27の場合:

# firewall-cmd --permanent --add-port=5000/tcp
# firewall-cmd --reload

Dockerレジストリが、Ubuntu16.4の場合:

# ufw status
# ufw allow 5000/tcp
# ufw reload ufw enable


Dockerイメージを作成してプライベートレジストリサーバーにアップロード
Build Dockerエンジンノードにログインしてください。 "build.itzgeek.local"


Dockerイメージのビルド
プライベートレジストリサーバーにアップロードするためのDockerイメージ(カスタマイズされたドッカーコンテナー用)を作成しましょう。 3つの方法で、コンテナイメージを構築/作成できます。
1. Commit
2. Dockerfile
3. Docker Compose

上記の方法のいずれかを実行することによって、アップロード用のドッカーイメージを作成し、維持することができます。

私は "build.itzgeek.local"に "hello-world:latest"と呼ばれるドッカーイメージを持っています。これをプライベートレジストリサーバにアップロードします。

root@build:~# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              e38bc07ac18e        2 months ago        1.85kB
root@build:~#

ここで、dockerイメージの名前をregistryserver:portnumber/image name:tagのように変更します。

イメージ名が指定された形式と一致しない場合、docker pushまたはpullコマンドは、プライベートレジストリからではなく、パブリックレジストリからイメージをアップロードまたはダウンロードしようとします。

Dockerイメージの名前を変更するには、dockerタグコマンドを使用します。

root@build:~# docker tag hello-world:latest registry.itzgeek.local:5000/hello-world:latest

Dockerイメージのリストを確認します。

root@build:~# docker images
REPOSITORY                                TAG                 IMAGE ID            CREATED             SIZE
registry.itzgeek.local:5000/hello-world   latest              e38bc07ac18e        2 months ago        1.85kB
hello-world                               latest              e38bc07ac18e        2 months ago        1.85kB


Dockerイメージのアップロード
Dockerレジストリの通信モード(セキュアまたは非セキュア)に応じて、以下のいずれかの方法を実行します。

ノンセキュア (プレーンHTTPレジストリ)
“/etc/docker/”ディレクトリに、“daemon.json” ファイルを編集/作成します。

root@build:~# vi /etc/docker/daemon.json

以下のコメントを追加します。

{
  "insecure-registries" : ["registry.itzgeek.local:5000"]
}


セキュア (自己署名)
レジストリサーバ "registry.itzgeek.local"から "build.itzgeek.local"の "/etc/docker/certs.d/registry.itzgeek.local:5000/ca.crt"に証明書 "ca.crt"をコピーします。

root@build:~# mkdir -p /etc/docker/certs.d/registry.itzgeek.local:5000/
root@build:~# scp -pr root@registry.itzgeek.local:/certs/ca.crt /etc/docker/certs.d/registry.itzgeek.local:5000/


ノンセキュア、セキュア両方のケースで、Dockerエンジンサービスを再起動します。

root@build:~# systemctl restart docker

以下のコマンドを使用して、Dockerイメージファイルをプライベートレジストリサーバーへアップロードします。

root@build:~# docker push registry.itzgeek.local:5000/hello-world:latest


プライベートレジストリサーバーからDockerコンテナイメージをダウンロードして展開
デプロイDockerエンジンノードにログインしてください。 "deploy.itzgeek.local"


ノンセキュア (プレインHTTPレジストリ)
“/etc/docker/”ディレクトリに、“daemon.json” ファイルを編集/作成します。

root@deploy:~# vi /etc/docker/daemon.json

以下のコメントを追加します。

{
  "insecure-registries" : ["registry.itzgeek.local:5000"]
}


セキュア (自己署名)
レジストリサーバ "registry.itzgeek.local"の"ca.crt"証明書を "deploy.itzgeek.local"の "/etc/docker/certs.d/registry.itzgeek.local:5000/にコピーします。

root@deploy:~# mkdir -p /etc/docker/certs.d/registry.itzgeek.local:5000/
root@deploy:~# scp -pr root@registry.itzgeek.local:/certs/ca.crt /etc/docker/certs.d/registry.itzgeek.local:5000/


ノンセキュア、セキュア両方のケースで、Dockerエンジンサービスを再起動します。

root@deploy:~# systemctl restart docker

以下のコマンドを使用して、プライベートレジストリサーバーからDockerイメージをダウンロードします。

root@deploy:~# docker pull registry.itzgeek.local:5000/hello-world:latest

"docker images"コマンドを使って利用可能なイメージのリストを確認します。

[root@deploy ~]# docker images
REPOSITORY                                TAG                 IMAGE ID            CREATED             SIZE
fedora                                    latest              cc510acfcd70        7 weeks ago         253MB
registry.itzgeek.local:5000/hello-world   latest              e38bc07ac18e        2 months ago        1.85kB

Dockerイメージが準備されています。

Fedora 27にDockerをインストールする手順

Fedora27をインストールする手順を記載します。以下のサイトを参考および翻訳しました。サイト管理者には、翻訳しブログに掲載することの許可は得ています。
www.itzgeek.com

Dockerはオープンソースコンテナ仮想化技術で近年急速に普及しており、アプリケーションをより効率的に展開する方法を提供しています。 Dockerを使用すると、アプリケーションは基本OS(Linuxオペレーティングシステム)の上のコンテナ内に常駐します。

Dockerは、cgroupsや名前空間などのカーネル機能を使用して、独立したコンテナを単一OS上で実行できるようにします。
Dockerは、Fedora 27、Fedora 26、およびFedora 25をサポートし、64ビットオペレーティングシステムでのみ動作します。


Dockerのエディション
Dockerは現在2つのエディションで利用可能です。
- Community Edition (CE)
- Enterprise Edition (EE)

この手順書では、Community Edition (CE)を使用します。


前提条件
古いバージョンの削除:
Dockerの古いバージョン(依存に関係する“docker”又は“docker-engine”)をアンインストールします。 システムにドッカーパッケージがない場合は、以下の手順をスキップしてください。

dnf remove -y docker docker-common container-selinux docker-selinux docker-engine

/var/lib/docker/にあるイメージ、ボリューム、ネットワークなどの重要な内容は保持されます。


Dockerのインストール
Dockerコミュニティパッケージは現在、 "docker-ce"と呼ばれています。 あなたのマシンにDocker CEリポジトリを追加しましょう。

dnf -y install curl
curl -o /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/fedora/docker-ce.repo

次に、dnfコマンドを使用してDockerコミュニティ版の最新バージョンをインストールします。

dnf -y install docker-ce

ノート:Docker CEの特定のバージョンをインストールする場合は、dockf-ce- [version]のようなバージョンをdnfコマンドに追加できます。
例:dnf -y install docker-ce-17.03.1.ce-1.fc25


Dockerの作業
今、あなたのマシンにDockerがインストールされています。
インストール後に自動的に起動しない場合は、Dockerサービスを開始します。

systemctl start docker
systemctl enable docker


最初のDockerコンテナを実行

# docker run -it fedora echo Hello-World

"docker run"コマンドを実行すると、dockerはFedoraベースイメージでコンテナを開始します。 デフォルトでは、Dockerはベースイメージをローカルでチェックします。 見つからなければ、Docker RegistryまたはDockerのprivate registry.sからベースイメージのダウンロードを開始します。
Fedoraコンテナを初めて実行しているので、出力は以下のようになります。

[root@localhost ~]# docker run -it fedora echo Hello-World
Unable to find image 'fedora:latest' locally
latest: Pulling from library/fedora
e71c36a80ba9: Pull complete
Digest: sha256:7ae08e5637170eb47c01e315b6e64e0d48c6200d2942c695d0bee61b38c65b39
Status: Downloaded newer image for fedora:latest
Hello-World
[root@localhost ~]#


非rootユーザーとしてのDockerの管理
"docker"というグループを作成し、root権限で次のコマンドを実行します。

# groupadd docker

ドッカーグループの一部になるユーザーを追加し、 "taro"を自分のユーザー名で置き換えます。

# useradd taro

ユーザーをdockerグループに追加します。

# usermod -aG docker taro

パーミッションを変更します。

# chown root:docker /var/run/docker.sock

これで、root以外のユーザーでDockerエンジンを実行できるようになります。

CentOS 7にDockerをインストールする手順

CentOS7にDockerをインストールする手順を記載します。以下のサイトを参考および翻訳しました。サイト管理者には、翻訳しブログに掲載することの許可は得ています。
www.itzgeek.com

Dockerは、近年広く普及しているコンテナ仮想化技術です。 アプリケーションをより効率的に展開する方法を提供します。 Dockerを使用すると、アプリケーションはLinuxオペレーティングシステム上のコンテナ内に常駐します。
Dockerは、cgroupsやnamespaceなどのカーネル機能を使用して、独立したコンテナを単一インスタンスで実行できるようにします。
この記事では、CentOS 7にDockerをインストールする方法を学びます。

注意 : Dockerは64bitオペレーティングシステムのみで動作します。

最初に、必要なパッケージをインストールします。

# yum -y install lvm2 device-mapper device-mapper-persistent-data device-mapper-event device-mapper-libs device-mapper-event-libs

Dockerのインストール
Dockerは現在2つのエディションで利用可能です。
- Community Edition (CE)
- Enterprise Edition (EE)

ここでは、Docker Comunity Edition (CE)をインストールします。

Dockerの古いバージョン(関連する依存関係"docker"または "docker-engine")をアンインストールします。

# yum  -y remove  docker-common docker container-selinux docker-selinux docker-engine

/var/lib/docker/の内容は心配しないでください。すべてが保存されます。

Docker Communityパッケージは現在、 "docker-ce"と呼ばれています。 ドッカーのインストール用にCEリポジトリを追加しましょう。

# yum -y install  wget
# wget https://download.docker.com/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

次のコマンドを使用してDocker CEの最新バージョンをインストールします。

# yum -y install docker-ce

Dockerの特定のバージョンをインストールしたい場合は、docker-ce- [version]のようにバージョンを追加してください。
例:yum install docker-ce-17.03.0.ce-1.el7.centos


Dockerサービスのコントロール

あなたのマシン上に、Dockerがインストールされました。インストール後に自動でスタートしていない事に備えて、Dockerサービスをスタートします。

# systemctl start docker
# systemctl enable docker

サービスが開始されたら、次のコマンドを実行してインストールを確認します。

# docker run -it centos echo Hello-World

"docker run"コマンドを実行するとどうなるかを見てみましょう。 最初にこのcentosコンテナを実行しているので、Dockerはcentosベースイメージを持つコンテナを開始します。出力は以下のようになります。

Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
7dc0dca2b151: Pull complete
Digest: sha256:b67d21dfe609ddacf404589e04631d90a342921e81c40aeaf3391f6717fa5322
Status: Downloaded newer image for centos:latest
Hello-World

Dockerはcentosイメージをローカルで検索し、見つからない場合、Dockerレジストリからcentosイメージのダウンロードを開始します。 イメージがダウンロードされると、コンテナが起動し、コンソールの "Hello-World"コマンドがエコーされ、出力の最後に表示されます。


Root以外のアクセスを許可

あなたが私のコマンドで見ることができるように、CentOSのために、私はDockerをrootユーザーとして実行しなければなりませんでした。 これを避けるには、root以外のユーザーがDockerコンテナを実行できるように、以下の手順に従います。
dockerというグループが存在しない場合は作成し、root特権で次のコマンドを実行します。

# groupadd docker
# useradd raj

ユーザーをDockerグループに追加します。

# usermod -aG docker raj

これで、root以外のユーザーでDockerを実行できます。


FirewallD

CentOS 7のFirewallDはDockerと競合する可能性があります。 サービスを無効にすることをお勧めします。

# systemctl stop firewalld
# systemctl disable firewalld

firewalldが起動または再起動されると、iptablesからDOCKERチェーンが削除され、Dockerが正常に動作しなくなります。
それでもsystemdを使いたい場合は、Dockerサービスの前にfirewalldを起動する必要があります。 Dockerの後にfirewalldを起動または再起動する場合は、Dockerデーモンを再起動する必要があります。

レッツエンクリプトをUbuntu16.04で使用する手順

Let's EncryptをUbuntu16.04で使用する手順を記載します。証明書を作成するドメインは、インターネットで名前解決が出来る必要があります。ここでは、プロバイダから割り当てられたグローバルIPから逆引きしたドメイン名を使用します。
このドキュメントでは、Ubuntu 16.04とApacheを使用した手順を記載します。
以下のページの翻訳となり、サイト管理者はからは許可を得ています。
www.itzgeek.com

Let's Encryptは、2016年4月にリリースされたTLS暗号化用の無料のX.509 SSL証明書を提供する広く知られている認証局です。

セキュアなWebサイトの証明書の作成、検証、署名、実装、および証明書更新について複雑なプロセスを排除した自動プロセスです。 任意のドメインの証明書を生成するには、ターミナル/シェルアクセスとCertbot ACMEクライアントをインストールする必要があります。 ダウンタイムなしで証明書の発行とインストールを自動化します。

現時点では、自動化プロセスではApache、Nginx、Haproxy、およびPlexのみが自動化プロセスをサポートしています。


Let's Encryptのインストール

ルートユーザーでログイン、またはルートユーザーにスイッチします。

sudo su

Certbot PPAを設定します。

apt-get update
apt-get install -y software-properties-common
add-apt-repository ppa:certbot/certbot

Press [ENTER] to continue or ctrl-c to cancel adding it
[ENTER]キーを押します

Certbotをインストールします。

apt-get update
apt-get install -y certbot

Apacheをインストールします。

apt-get install -y apache2


Webサービスが動作している事を確認してください。

http://your.ip.add.ress

Apacheのデフォルトページが表示されるはずです。


ドメインのための証明書を作成
certbotコマンドを使用して、Let's Encrypt証明書を手動で作成します。

certbot certonly --webroot -w /var/www/html -d p3333333-xxxxx.ocn.ne.jp   (xxxはマスクしています)

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): xxxxxx@ocn.ne.jp  (メールアドレスを入力します)
Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: A   (Aを入力します)

-------------------------------------------------------------------------------
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o: N   (Nを入力します)
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for p3333333-xxxxx.ocn.ne.jp
Using the webroot path /var/www/html for all unmatched domains.
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/p3333333-xxxxx.ocn.ne.jp/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/p3333333-xxxxx.ocn.ne.jp/privkey.pem
   Your cert will expire on 2018-08-04. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le


Webサーバーの設定をアップデート
作成した証明書を使用するよう、Apacheサーバーの設定を更新します。

vi /etc/apache2/sites-available/default-ssl.conf

以下の赤色の部分を追加、または変更します。

<IfModule mod_ssl.c>
<VirtualHost _default_:443 >
ServerAdmin webmaster@localhost
ServerName p3333333-xxxxx.ocn.ne.jp
DocumentRoot /var/www/html

# SSL Engine Switch:
# Enable/Disable SSL for this virtual host.
SSLEngine on
SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:
SSLHonorCipherOrder on
SSLOptions +StrictRequire

# SSLCertificateFile directive is needed.
SSLCertificateFile /etc/letsencrypt/live/p3333333-xxxxx.ocn.ne.jp/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/p3333333-xxxxx.ocn.ne.jp/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/p3333333-xxxxx.ocn.ne.jp/chain.pem

Apacheサーバーに、HTTPからHTTPSへのリダイレクト設定を行います。

vi /etc/apache2/sites-enabled/redirect.conf

以下を追加します。

<VirtualHost *:80>
ServerName p3333333-xxxxx.ocn.ne.jp
RewriteEngine On
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

Apacheサービスを再起動します。

a2enmod rewrite
a2enmod ssl
a2ensite default-ssl.conf
service apache2 restart

ウェブサイトにアクセスして、「Let's Encrypt」証明書を確認します。
http://your-http-web-site (httpsへリダイレクトされます)
or
https://your-http-web-site


証明書の更新
Let's Encrypt Encryptの有効期間は約90日です。期限が切れる前に証明書を更新するようcron(Linux Scheduler)ジョブを設定することをお勧めします。
cronジョブを設定する前に、以下のコマンドを実行して証明書の自動更新をシミュレートしてください。

certbot renew --dry-run

出力

Saving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Processing
/etc/letsencrypt/renewal/p3333333-xxxxx.ocn.ne.jp.conf
-------------------------------------------------------------------------------
Cert not due for renewal, but simulating renewal for dry run
Plugins selected: Authenticator webroot, Installer None
Starting new HTTPS connection (1): acme-staging-v02.api.letsencrypt.org
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for p3333333-xxxxx.ocn.ne.jp
Waiting for verification...
Cleaning up challenges

-------------------------------------------------------------------------------
new certificate deployed without reload, fullchain is
/etc/letsencrypt/live/p3333333-xxxxx.ocn.ne.jp/fullchain.pem
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates below have not been saved.)

Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/p3333333-xxxxx.ocn.ne.jp/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates above have not been saved.)
-------------------------------------------------------------------------------

IMPORTANT NOTES:
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.

上記の出力にて、更新が適切に機能していることを確認します。 次に、以下のコマンドのcronジョブを設定します。

certbot renew