20210119のLinuxに関する記事は14件です。

Ceph(Octopus)の構築(設定編 共通)

はじめに

この記事では、タイトルのとおり現時点(2021.01)で最新であるceph(octopus)の構築を目的としています。
また、自分で構築した手順の備忘録を兼ねているので、細かいところで間違いなどあるかもしれません。

基本的には公式のDOCUMENTATIONが必要なことを全て網羅しているので一読しておくことをお勧めします。
Linuxの知識もある程度必要になるので他サイトや書籍などで事前に基本は押さえておくとよいでしょう。

関連記事

Ceph(Octopus)の構築(準備編 ハードウェア)
Ceph(Octopus)の構築(準備編 ソフトウェア)
Ceph(Octopus)の構築(設定編 共通) この記事
Ceph(Octopus)の構築(設定編 ブートストラップ)
Ceph(Octopus)の構築(設定編 mon/mgr/osd)

クラスタ構成

15台のノードを3グループに分け構成します。各グループ毎にL2SWを用意し、L3SWで集約しました。詳細は以下のとおりです。
以降、この構成を前提に話を進めていきます。

グループ ホスト名 役割
0 ceph-mon01 mon/mgr/osd
0 ceph-mds01 mds/osd
0 ceph-osd01 mds(※)/osd
0 ceph-osd02 osd
0 ceph-osd03 osd
1 ceph-mon11 mon/mgr/osd
1 ceph-mds11 mds/osd
1 ceph-osd11 mds(※)/osd
1 ceph-osd12 osd
1 ceph-osd13 osd
2 ceph-mon21 mon/mgr/osd
2 ceph-mds21 mds/osd
2 ceph-osd21 mds(※)/osd
2 ceph-osd22 osd
2 ceph-osd23 osd

※ mdsはceph-mdsXXをactiveとし、ceph-osdXXをstandbyとします。

OS準備

OSのインストールについては私が説明するよりも他サイトを参考にされた方がよいと思うのでここでは省略します。今回はCentOS7を利用しました。
cephを動かすためにデスクトップ環境は不要なのでMinimalを使いました。

公式のDownloadから適当なミラーを選んでダウンロードしましょう。
CentOS Project

OS標準機能の設定

時刻同期

chronyを使って時刻同期設定を行います。参照可能なサーバを指定します。
今回は各グループのceph-monXXが既設NTPサーバと同期し、それ以外のノードは各グループのmonノードと同期するようにしました。

vi /etc/chrony.conf

monノードの場合、以下を追加

server [NTPサーバのIP] iburst
allow [他ノードのネットワークセグメント]

monノード以外の場合、以下を追加

server [monノードのIP] iburst

SSH

DNSを使う設定(デフォルト)の場合、名前で接続すると遅いことがあるので無効にします。

vi /etc/ssh/sshd_config

UseDNS no

FW

万が一うまく動かなかったときの原因切り分けがめんどくさいのでFWは止めておきます。

systemctl stop firewalld
systemctl disable firewalld
SELinux

FWと同様の理由で無効化しておきます。

vi /etc/selinux/config

SELINUX=disabled

hostsの編集

ノードとなるホスト名をhostsへ追記します。

vi /etc/hosts

192.168.1.101 ceph-mon01
192.168.1.102 ceph-mds01
192.168.1.103 ceph-osd01
・・・
192.168.1.111 ceph-mon11
・・・
192.168.1.121 ceph-mon21
・・・
192.168.1.125 ceph-osd23

パッケージ更新

とりあえず最新版にアップデートしておきます。

yum -y update

追加機能の設定

dockerの追加

octopusではコンテナソフトが必須なのでdockerをインストールしました。イメージのpullはブートストラップを実行したときとクラスタにノードを追加したときに自動的に実行されます。そのため、ここではパッケージのみ入れておけば大丈夫です。

yum -y install yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum -y install docker-ce docker-ce-cli containerd.io
systemctl start docker
systemctl enable docker
python3の追加

cephadmに必要だったような気がします。入れておかないと何か大事なコマンドが使えなかったはずです。(ごめんなさい忘れてしまいました。)

yum -y install python36

おわりに

共通して全てのノードに必要な作業は以上です。
OSだけ先にインストールして、TeraTerm等で作業をすると効率的にできます。
hostsについては全ノードに同一のもの(15台記載)を設定する必要があるかどうかは不明です。
もしかしたら必要ないかもしれません。(monノードには恐らく必要だと思います。)

cephの個別設定については次の記事に投稿しようと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

fprintdでいちいちパスワードを打たずに指紋を登録するには

Arch Linuxでfprintdを使っていたら,突然指紋を登録する際に特権を要求されるようになったので調べてなんとかしました。

変更部分

/usr/share/polkit-1/actions/net.reactivated.fprint.device.policy
<action id="net.reactivated.fprint.device.enroll">
  <description>Enroll new fingerprints</description>
  (中略)
  <defaults>
    <allow_any>no</allow_any>
    <allow_inactive>no</allow_inactive>


-   <allow_active>auth_self_keep</allow_active>

+   <allow_active>yes</allow_active>


  </defaults>

<allow_active>の要素を"auth_self_keep"から"yes"に書き換えてください。

その後,polkitデーモンを再起動(systemd環境なら systemctl restart polkit.service)すればパスワードなしで指紋が登録できるようになるはずです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

fprintdで指紋登録時にパスワードが要求される時の対処法

Arch Linuxでfprintdを使っていたら,突然指紋を登録する際に特権を要求されるようになったので調べてなんとかしました。

変更部分

/usr/share/polkit-1/actions/net.reactivated.fprint.device.policy
<action id="net.reactivated.fprint.device.enroll">
  <description>Enroll new fingerprints</description>
  (中略)
  <defaults>
    <allow_any>no</allow_any>
    <allow_inactive>no</allow_inactive>


-   <allow_active>auth_self_keep</allow_active>

+   <allow_active>yes</allow_active>


  </defaults>

<allow_active>の要素を"auth_self_keep"から"yes"に書き換えてください。

その後,polkitデーモンを再起動(systemd環境なら systemctl restart polkit.service)すればパスワードなしで指紋が登録できるようになるはずです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Windows Subsystem for Linux(WSL) を起動できないとき

Microsoft StoreからダウンロードしたUbuntuが起動できない...

スクリーンショット 2021-01-19 172846.png

原因はwsl.exe が存在しない為

'wsl.exe' とは

Windows Subsystem for Linux とは、Linuxのバイナリ実行ファイルをWindows 10およびWindows Server上でネイティブ実行するための互換レイヤーである。

解決方法

  • Windows Insider Programに入る
  • Windows 10 のプレビュー ビルド (OS ビルド 20262 以降) をインストールする。
  • 管理者権限でwsl --installを実行してインストール

手順

注: microsoft様に診断データをご献上しないとInsider Programにはいれなかった

設定>プライバシー>診断&フィードバック

スクリーンショット 2021-01-19 165731.png

  1. Insider Programに入る

    設定>更新とセキュリティ>Windows Insider Program

  2. Windows 10 のプレビュー ビルド (OS ビルド 20262 以降) をインストール

    • windows updateを開いて一度更新の確認をかける
    • 出てきたWindows Insider previewをインストールする
  3. wsl.exeをインストール

    • 管理者権限でコマンドプロンプトを起動
    • 'wsl --install' を実行
    • 再起動後wsl.exeが使えるようになる image.png

起動した。

image.png

参考

Windows 10 用 Windows Subsystem for Linux のインストール ガイド

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

sedコマンド で、-iオプションと-eオプションを付けたときに不要なファイルができるバグ

問題

例えば以下を実行すると

sed -i -e 's/# gem "rails"/gem "rails"/' ./Gemfile

Gemfile-eという名前の不要なファイルが作成されてしまうんですね。

解決策

-iオプションの後ろに、""を入れます。

sed -i "" -e 's/# gem "rails"/gem "rails"/' ./Gemfile

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker 簡単インストール手順(CentOS)

本記事の内容

  • Linux(CentOS)にDockerを簡単にインストールする。
  • curl | shでインストールする際の注意点を理解する。

※本手順はインストールするDockerのバージョンや依存パッケージを指定できないため、本番環境での使用は推奨されない。

前提条件

  • CentOS 7 または 8
  • Dockerがインストールされていない。

AWS Lightsail の CentOS バージョン 7.9.2009 で動作を確認。

※インストールスクリプトはDebian、Fedora、Raspbian、RHEL、Ubuntuにも対応しているが、コマンドyumcurlsystemctlの部分は適宜読み替える必要がある。
※RHELはコマンドが同一のため、本手順がそのまま使える想定。

インストール手順

1. 未インストール確認

$ yum list installed | grep docker

何も表示されなければ、Dockerがインストールされていないので作業を進める。

2. 管理者(root)への切替

$ sudo su -

3. インストール

公式サイトより、curlでインストールスクリプトを取得し、shで実行する。

# curl -fsSL https://get.docker.com | sh

スクリプトはLinuxの種類を自動判別し、必要なコマンドを実行する。
CentOSの場合の主な内容は以下の通り。

  1. 「yum-utils」のインストール。(2. の実行に必要)
  2. 「yum-config-manager」で、Dockerの取得先リポジトリhttps://download.docker.com/linux/centos/docker-ce.repoを追加。
  3. 「docker-ce」と依存パッケージをインストール。

スクリプトの内容はブラウザからも確認できる。
https://get.docker.com

このようなインストール方法には注意点もある。
提供スクリプトに悪意がある場合はもちろんだが、ブラウザから確認した際には正しいスクリプトを返し、curlなどコマンドから要求した際には不正なスクリプトを返すことも、技術的には可能。
curl -fsSL https://get.docker.comのように、| shを除けばスクリプトを実行せずに内容を確認できるので、心配な場合は確認する。

また、スクリプトを取得する際に一部が欠落し、意図しないコマンドが実行される可能性もある。
get.docker.comは、インストール処理を関数「do_install」として定義し、最終行で実行する対策がされている。

4. インストールされたパッケージの確認

$ yum list installed | grep docker
containerd.io.x86_64                1.4.3-3.1.el7              @docker-ce-stable
docker-ce.x86_64                    3:20.10.2-3.el7            @docker-ce-stable
docker-ce-cli.x86_64                1:20.10.2-3.el7            @docker-ce-stable
docker-ce-rootless-extras.x86_64    20.10.2-3.el7              @docker-ce-stable

5. 起動・OS起動時の自動起動設定

# systemctl start docker && systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

6. バージョン確認

# docker version
Client: Docker Engine - Community
 Version:           20.10.2
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        2291f61
 Built:             Mon Dec 28 16:17:48 2020
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.2
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       8891c58
  Built:            Mon Dec 28 16:16:13 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.3
  GitCommit:        269548fa27e0089a8b8278fc4fc781d7f65a939b
 runc:
  Version:          1.0.0-rc92
  GitCommit:        ff819c7e9184c13b7c2607fe6c30ae19403a7aff
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

7. 動作確認(hello-world)

# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete 
Digest: sha256:31b9c7d48790f0d8c50ab433d9c3b7e17666d6993084c002c2ff1ca09b96391d
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

参考

公式サイト
Install Docker Engine on CentOS | Docker Documentation

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LVMの移行作業 (vgexport, vgimport)

概要

LVMをA端末からB端末へ移行する方法について説明する。
大雑把にはA端末でVGをエクスポートして、それをB端末で読み込んでマウントするといった流れである。

Export

まずA端末上で、移行するVGの確認

$ sudo vgdisplay

  --- Volume group ---
  VG Name               ubuntu-vg
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <447.13 GiB
  PE Size               4.00 MiB
  Total PE              114465
  Alloc PE / Size       114464 / 447.12 GiB
  Free  PE / Size       1 / 4.00 MiB

移行に入る前にVGを不活性化する。

$ sudo vgchange -a n [VG Name]

VG情報のエクスポート

$ sudo vgexport [VG Name]

エクスポートできたか確認

$ sudo pvscan

  PV /dev/sdb1 is in exported VG

Import

ここでA端末のVGの物理ディスクをB端末へ差し替える。
次にB端末上で移行してきたLVMが認識されているかを確認する。

$ sudo pvscan
  PV /dev/sdb1 is in exported VG

VGをインポートする。

$ sudo vgimport [VG Name]

Mount

B端末上でLVを探す。

$ sudo lvscan
  INACTIVE            '/dev/ubuntu-vg/root' [446.17 GiB] inherit

活性化させる。

$ sudo lvchange --available y ubuntu-vg

活性化されたかの確認。

$ sudo lvscan
  ACTIVE            '/dev/ubuntu-vg/root' [446.17 GiB] inherit

最後にマウントする。

$ sudo mount /dev/ubuntu-vg/root /mnt/oldDisk
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Alpine Linux で edge computing を楽しむ

というわけで、
とうとう高みを目指しているプロジェクトの様子を伺おうと、ラップトップでマルチブートさせてみました。

日本語入力がibus-anthyだけでしたので、mozc
がない理由を調べていました。ビルドのステップ自体は簡易化されています。
他のディストリビューションで普通に長らく使われてきたのですから、mozc本体には当然問題はありません。
LinuxやAndroid向けは、Docker上のUbuntuコンテナで動かし、バイナリを作る形のようです。

今はプロセスが明確化されて、パッケージもビルドも、メンテナンスしてくれている人たち。わかる人たちがいる限り、私達は恩恵を受け続けることができますね。
Alpine Linux上でもmozcの恩恵を受けようと思い立ちました。

edgeからgypがありませんでしたが、ビルドできました。
コンテナ内で最低限の最新の状態で、samurai(ninja)もエラーを出さず動いてくれました。

メンテナンスされている方々、ご苦労さまです。ありがとうございます。

手を加えたところは、clang前提のビルド環境でしたが、gccでもビルドできることを確認していたので、それに合わせて、gyp/common.gypiの中身を調整。
base/mutex.ccで、RECURSIVE_NPからRECURSIVEにするだけの、分岐の修正一箇所。

固有のヘッダーの場所を変えるなど、トリッキーなことをすれば、alpine上でclangでもビルドできることは確認しています。

あとはソースからインストールしても同じですが、abuildの仕組みを把握するために、ninjaのAPKGBUILDやibus-anthyさんのパッケージを参考にしました。

ibus-mozcのパッケージをaportsのtestingにのっけるには、、、手順を確認しないといけませんね。メールは送ったけど、ninjaがメンテナンスからedgeでは外れてるみたいなので、そこの関係を説明しないと、他の人もつまずくかもしれません。samuraiパッケージで動きました。

現状、alpine linux上で、ibus-anthyもibus-mozcも切り替えて、どちらも動作してくれました。
設定パネルも表示できて、普通に日本語入力ができるようになりました。
日本語だよ。わーい。本当にありがたい。
インストール方法については、ibus-mozcのビルド記が簡潔で参考になりました。

上記の参考サイトを参考にすれば、いろいろな環境で手動でもインストール可能かと思います。

パッケージはaportsのtestingが受け付けられたら、なのですが、ninjaとの関係も含めて整理しないとOKされないかなぁ。
またクリーンな素のalpineコンテナ上でビルドプロセスやパッケージの依存関係を確認して整理してみたいと思います。

みなさん、いろんな情報をまとめてくださっていて、ありがとうございます。
以上です。

'mozc google'
'mozc branch alpine_edge'

apk update
apk upgrade
apk add alpine-sdk clang samurai ibus-dev qt5-qtbase-dev gtk+2.0-dev \
        py3-core-api samurai pkgconf git clang

git clone --branch alpine_edge --single-branch --depth 1 --recursive https://github.com/phoepsilonix/mozc mozc
git submodule update --init

cd mozc/src
python3 build_mozc.py gyp
python3 build_mozc.py build -c Release package
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

TFSwitch terraformのバージョン管理

TFSwitch 使いましょう

terraform のバージョン管理ツール

tfswitch

環境

OS環境:macOS Big Sur ver11.1

インストール

brewコマンドにて、インストール

$ brew update
$ brew install warrensbox/tap/tfswitch

Error

エラーが発生しました。お使いのCLTはmacOS 11をサポートしていません。
それは古いか、変更されています。
CLTをアップデートするか、アップデートがない場合は削除してください。
システム環境設定のソフトウェアアップデートからアップデートするか、実行してください。

$ softwareupdate --all --install --force

アップデートは表示されなかったので

それでもアップデートが表示されない場合は、以下のようにしてください。

$ sudo rm -rf /Library/Developer/CommandLineTools
$ sudo xcode-select --install

Error

もともとterraformwpインストールしてしまっているとシンボリックリンクが貼られていてダメみたいですね。

$ brew unlink terraform

バージョン確認

$ tfswitch -v

terraform インストール

$ tfswitch

セレクトできるようになるので、インストールしたいバージョンの選択すると勝手にインストールされる。
今回は、v0.12へのアップデートを確認したいので、v0.12系をインストール

バージョン確認

$ terraform -version
Terraform v0.12.30

バージョンアップ対応

今回は、v0.11 ? v0.12へのアップデートを調査

$ terraform 0.12upgrade

This command will rewrite the configuration files in the given directory so
that they use the new syntax features from Terraform v0.12, and will identify
any constructs that may need to be adjusted for correct operation with
Terraform v0.12.

We recommend using this command in a clean version control work tree, so that
you can easily see the proposed changes as a diff against the latest commit.
If you have uncommited changes already present, we recommend aborting this
command and dealing with them before running this command again.

Would you like to upgrade the module in the current directory?
  Only 'yes' will be accepted to confirm.

  Enter a value:

何も出なければ、正常完了で、既存のコードが修正されます。
エラーが出たら、その修正を行い再度、実行します。

AWS EBSのgp3を使用したいがために、v0.14 系まで上げるのしんどい。

とほほ。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

アリババクラウドECSにホストされたCentOS 7サーバーのセットアップ

このガイドでは、Alibaba Cloud Elastic Compute Service (ECS)上でホストされているCentOS 7サーバの初期セットアップのベストプラクティスについて説明します。

Alibaba Cloud Tech Share執筆、 Francis Ndungu。 Tech Shareは、技術的な知識やベストプラクティスをクラウドコミュニティ内で共有することを奨励するAlibaba Cloudのインセンティブプログラムです。

Alibaba Cloud Elastic Compute Service (ECS)は、従来の物理サーバと比較して、クラウドアプリケーションをより高速かつ強力に実行する方法を提供します。クラウドのニーズに対して大きな成果を得ることができます。ECSを使用すると、最新世代のCPUでより多くの成果を得ることができるだけでなく、DDoSやトロイの木馬の攻撃からインスタンスを保護することができます。

このガイドでは、Alibaba Cloud Elastic Compute Service (ECS) インスタンス上でホストされた CentOS 7 サーバーをプロビジョニングするためのベストプラクティスについて説明します。

前提条件

1、有効なAlibaba Cloudアカウント。まだお持ちでない場合は、無料トライアルにサインアップして、最大300ドル相当のAlibaba Cloud製品をお楽しみください。
2、CentOS 7を実行しているECSインスタンス。お好みのリージョンと構成を選択できます。
3、サーバーのルートパスワード。

ステップ1: Alibaba Cloud CentOS 7サーバーに接続

Alibaba Cloud ECSインスタンスに関連付けられたインターネットIPアドレス(パブリックIPアドレス)を探します。

LinuxまたはMacを実行している場合は、ターミナルアプリケーションを使用してSSH経由でインスタンスに接続します。Windowsをお使いの場合は、PuTTy(こちらからダウンロード)を使用してサーバーに接続することができます。SSH経由でログインするには、Alibaba Cloud ECSインスタンスを作成した際に設定したIPアドレス、ユーザー名、パスワードを入力する必要があります。

ECSインスタンスに接続する方法は他にもあります。詳しくはECSの公式ドキュメントをご覧ください。

ステップ2: CentOS 7サーバのホスト名を変更

ホスト名は、Linux サーバと通信する際のデフォルトの識別子です。これは、自宅のPCやラップトップに関連付けられたコンピュータ名のようなものです。CentOS 7 サーバに説明的なホスト名を付けることで、特に複数のマシンを運用している場合には、マシンを区別するのに役立ちます。

開始するには、以下のコマンドを入力して、CentOS 7 システムが最新の状態であることを確認します。

$ sudo yum update

ホスト名を確認するには、ターミナルウィンドウで以下のコマンドを入力します。

$ hostname

ホスト名を変更するには、以下のコマンドでnanoテキストエディタをインストールする必要があります。

$ sudo yum install nano

次に、/etc/cloud/cloud.cfg ファイルを編集して、 preserve_hostname というエントリを見つけます。その値を false から true に変更します。

$ sudo nano /etc/cloud/cloud.cfg
preserve_hostname true

CTRL + X, Yを押してからEnterを押して終了し、変更を保存します。

次に、以下のコマンドを入力して、nanoエディタを使って/etc/hostnameファイルを編集します。

$ sudo nano /etc/hostname

ファイルの一番上に書かれている現在のホスト名を上書きし、CTRL + X, Y を押してから Enter を押して変更を保存します。

また、Linux hosts ファイルにいくつかのエントリを追加する必要があります。テキストエディタを使ってファイルを開きます。

$ sudo nano /etc/hosts

このファイルの 127.0.0.0.1 localhost エントリのすぐ下に 2 つのエントリを追加する必要があります。最初に追加するエントリは、ループバックインターフェースのアドレス 127.0.1.1 を使用します。これは、同じファイル内の 'localhost' の値を持つ 127.0.0.1 とは異なることに注意してください。

サーバのパブリックIPアドレスが111.111.111.111.111で、ホスト名がmiamiだとすると、/etc/hostsファイルの一番上に以下のようなエントリがあるはずです。

127.0.0.1 localhost
127.0.1.1 miami
111.111.111.111 miami

以下のコマンドを入力して、Alibaba Cloud ECSインスタンスを再起動して変更を有効にします。

$ sudo reboot

ステップ3: CentOS 7サーバでタイムゾーンを設定する

以下のコマンドを入力することで、Alibaba Cloud CentOS 7サーバーのデフォルトの日付とタイムゾーンを確認することができます。

$ timedatectl 

特にCentOS 7サーバ上でcronジョブを実行している場合は、日付と時刻に大きく依存するため、正しいタイムゾーンを設定する必要があります。タイムゾーンを変更するには、以下のコマンドを使用します。

$ sudo timedatectl set-timezone 

例えば、サーバーのタイムゾーンをロンドンに設定するには、以下のコマンドを使用します。

$ sudo timedatectl set-timezone Europe/London

dateコマンドを実行して、変更が成功したかどうかを確認することができます。

$ date

ステップ4: CentOS 7上でSudo権限を持つ非rootユーザーを作成する

ルートユーザを使ってCentOS 7サーバにログインすると、多くの問題が発生する可能性があります。例えば、間違ったパラメータを入力して単純な 'rm' コマンドを実行すると、本番環境のサーバデータ全体が消去されてしまう可能性があります。

そのため、sudo 権限を持つ非 root ユーザーを作成する必要があります。必要に応じて sudo コマンドを使用して、一時的に権限を昇格させることができます。

ユーザーを作成するには、以下のコマンドを使用します。

$ sudo adduser 

例えば、サーバにjamesとして識別されるユーザを追加するには、以下のコマンドを使用します。

$ sudo adduser james

次に、上記で作成したユーザーにパスワードを割り当てます。

$ sudo passwd james

ユーザーのパスワードを入力するように促されます。

次に、次のように入力してsudoコマンドで管理タスクを実行する機能を割り当てるために、ユーザーをホイールグループに追加する必要があります。

$ sudo gpasswd -a james wheel

jamesをお好みの正しいユーザー名に置き換えることを忘れないでください。

ステップ5: CentOS 7サーバにログインするための認証キーペアを作成する

秘密鍵と公開鍵のペアを使用してCentOS 7サーバにログインすると、パスワードを使用するよりも安全です。このモードでは、秘密鍵をローカルコンピュータに、公開鍵を Alibaba Cloud サーバ上の .ssh/authorized_keys ファイルの下に保持します。

この技術は、公開鍵を介してサーバから送信されたデータを暗号化し、ユーザは、あなただけが知っている正しい秘密鍵を使用して復号化することができます。このようにして使用される鍵は、最も機知に富んだハッカーであっても推測することはできません。また、秘密鍵をパスフレーズで保護することで、悪意のある人の手に落ちた場合に備えて、セキュリティの別の層を追加することもできます。

PuTTY key Generator (ダウンロードはこちら) のようなツールを使って秘密鍵/公開鍵のペアを生成することができます。

鍵を生成するユーザーとしてログインしていることを確認してください。また、以下のコマンドは 'sudo' を使って実行しないでください。

以下のコマンドを使って、公開鍵の部分をCentOS 7のサーバにコピーします。

$ mkdir ~/.ssh

そして、nanoエディタを使って、authorized_keysファイルに自分の公開鍵をタイプして貼り付けます。

$ nano ~/.ssh/authorized_keys

以下のコマンドを入力してファイルを保護します。

$ chmod 700 -R ~/.ssh && chmod 600 ~/.ssh/authorized_keys

鍵を作成したら、SSH接続で作成したユーザ名と秘密鍵を使って、CentOS 7サーバにログインできるようになります。

ステップ6: CentOS 7サーバでパスワード認証を無効にする

秘密鍵と公開鍵のペアを設定したら、パスワードベースのログインを無効にしてください。これにより、正しい秘密鍵を持った人だけが CentOS 7 サーバにアクセスできるようになります。

これを行うには、以下のコマンドで SSH 設定ファイルを編集します。

$ sudo nano /etc/ssh/sshd_config

「PasswordAuthentication」の行を見つけ、値を「yes」から「no」に変更します。

PasswordAuthentication no

SSH デーモンを再起動します。

$ sudo service sshd restart

ステップ7: CentOS 7サーバでSSHルートアクセスを無効にする

sudo 権限とパスワードによるログインを無効にした非 root ユーザを作成したら、SSH 経由での root ログインを無効にしてください。これにより、誰もrootユーザ名を使ってSSH経由でCentOS 7サーバにログインできないようになります。

この時点からの管理作業は、sudo権限を持つ非rootユーザが行うことになります。

SSH 経由での root アクセスを無効にするには、nano エディタで SSH 設定ファイルを編集し、PermitRootLogin ディレクティブを探して、その値を yes から no に変更します。

$ sudo nano /etc/ssh/sshd_config
PermitRootLogin no

変更を有効にするには、以下のコマンドを入力して SSH デーモンを再起動してください。

$ sudo service sshd restart

ステップ8: CentOS 7サーバーにファイアウォールをインストールする

CentOS 7では、UFW(Uncomplicated Firewall)と呼ばれるツールを使ってIPテーブルを操作することができます。UFWは、特にLinux環境に慣れていない初心者のために、IPテーブルの設定プロセスを簡素化することを目的としたツールです。

UFWは、Alibaba Cloud上で動作するCentOS 7サーバに別のセキュリティを追加するのに適しています。

以下のコマンドを使用してインストールすることができます。

$ sudo yum install ufw

次に、以下のコマンドを入力して、すべての発信通話を許可し、着信を拒否または着信するようにします。

$ sudo ufw default deny incoming
$ sudo ufw default allow outgoing

以下のUFWコマンドを使用して、特定のポートやサービスへのトラフィックを許可することができます。

$ sudo ufw allow 

CentOS 7 サーバから完全にロックされないようにするために、UFW で最初に許可するポート/サービスは 22 番ポートで SSH 接続を待ち受けています。

これを行うには、以下のコマンドを入力してルールを追加します。

$ sudo ufw allow 22

または

$ sudo ufw allow ssh

また、Webサーバーを運用している場合は、httpポートとhttpsポートを有効にしておきましょう。

$ sudo ufw allow http
$ sudo ufw allow https

サービスをホワイトリストに登録したら、以下のコマンドを実行してUFWを起動します。

$ sudo ufw enable

作成したルールは、まず番号を確認してから以下のコマンドで削除することで削除できます。

$ sudo ufw status numbered
$ sudo ufw delete 

ここで、<rule number>は、利用可能なルールのリストから上記の値を取得したものです。

ルール一覧を確認する前に、UFWが有効になっていることを確認してください。

以下のコマンドを入力することで、いつでもUFWを無効にすることができます。

$ sudo ufw disable

または、タイプしてすべてのルールをリセットします。

$ sudo ufw reset

ステップ9: CentOS 7サーバにFail2Banをインストールする

Fail2Banは、IPテーブルを利用してCentOS 7サーバにセキュリティの別のレイヤーを追加するツールです。Fail2Banは、ログインに失敗した回数に基づいて、サーバーにアクセスしようとするユーザーを禁止します。

Fail2Banをインストールするには、以下のコマンドを入力します。

$ sudo yum install fail2ban

サーバーはデフォルトのFail2Banの設定で使用できますが、必要に応じて設定ファイルを編集して変更することができます。すべてのFail2Ban設定ファイルは、'/etc/fail2ban/'ディレクトリにあります。

デフォルトでは、.confファイルが最初に読み込まれ、その後に.localファイルが続きます。そのため、設定を上書きしたい場合は、.local ファイルに変更を加え、.conf ファイルはそのままにしておく必要があります。

例えば、以下のコマンドを使用して、jail.confファイルのコピーを作成し、編集用のローカルファイルを作成することができます。

$ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local


その後、以下のコマンドで新しいファイルを編集することで、Fail2Banの設定を変更することができます。

$ sudo nano /etc/fail2ban/jail.local

ほとんどの場合、SSH 接続の禁止時間、検索時間、リトライ回数の最大値を設定することになります。これはすべて、CentOS 7 サーバに必要なセキュリティレベルに依存します。

まとめ

これで完了です。
Alibaba Cloud Elastic Compute Service(ECS)上で動作するCentOS 7サーバのプロビジョニングに成功しました。これは、サーバをセットアップする際に取るべきLinuxのセキュリティ対策の決定的なリストではありませんが、特にECSを使い始めたばかりの場合は、ハッカーを遠ざけることができます。これで、Web サイトや Web アプリケーションを実行するための Web サーバとデータベースサーバをインストールすることができます。チュートリアルを読んで楽しんでいただけたでしょうか?

Alibaba Cloudは初めてですか?アカウントにサインアップして、40以上の製品を無料でお試しください。または、Getting Started with Alibaba Cloudをご覧ください。

本ブログは英語版からの翻訳です。オリジナルはこちらからご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。

アリババクラウドは日本に2つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
アリババクラウドジャパン公式ページ

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LPIC Lv1のメモ

LPIC101

ジャンル名

Systemd

Systemdとは

udev

udevとは

スワップ領域

スワップ領域とは

リングバッファ

リングバッファとは

MBR

MBRとは

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LPIC Lv1-101(Ver5.0)のメモ

システムアーキテクチャ(主題101)

ハードウェア設定の決定と設定

システムの起動

Systemd

Systemdとは

MBR

MBRとは

初期RAMディスク

初期RAMディスクとは

udev

udevとは

スワップ領域

スワップ領域とは

リングバッファ

リングバッファとは

ランレベル/ブートターゲットの変更

NFS

NFS
NFSとは
知っておきたいNFSの基本と活用法

halt

halt, shutdown, poweroffの違い

ACPI

ACPIとは
acpidとは

Linuxのインストールとパッケージ管理(主題102)

ハードディスクのレイアウト設計

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

macOS と Linux は全くの別物?

※この文章はベータ版です。

「Dockerとはどういったものなのか、めちゃ
くちゃ丁寧に説明してみる」を読んで、気に
なったので、書いています。

https://qiita.com/SatoshiSobue/items/a612ebbb3a9242c09db5

macOSとLinux(広義のLinux)は上層では全く別物と
いっても過言ではないくらい違いますが、下層の
カーネルレベルではUNIXというOSアーキテクチャに
則って実装されているレイヤを持つ血統?的には近い?
OSです。

macOSのXNUカーネルはカーネギーメロン大学
で開発されたmachマイクロカーネル派生の
カーネルです。

XNUカーネルはFreeBSDのコードをベースとして
実装されたBSDレイヤをもっています。
(XNUカーネルのBSDレイヤには、Linuxカーネル
のAPIを採用している部分があります。)

macOSは、XNUカーネルのBSDレイヤにより、
UNIX仕様に準拠した、UNIX互換のOS、と
なっています。

Linuxカーネル(狭義のLinux)は、POSIXに準拠し、
UNIX仕様に沿って実装されていて、UNIX仕様に
ほぼ準拠している、UNIX互換のOSです。

(UNIX仕様を管理しているThe Open Group
から認証されないとUNIXとは名乗れませんし、
UNIX仕様に準拠している、とも言え(書け)
ません。

UNIX認証には費用が掛かります。OSSである
Linuxの開発サイドは費用の掛かるUNIX認証の
必要性を感じていませんでしたし、今も
感じていないでしょう。)

UNIX互換レイヤが、Linuxでは、カーネルのコア機能に
組み込まれていて不可分となっていて、macOSのXNU
カーネルでは、カーネルのコア機能と分離されている、
点が違うものの、どちらもUNIX互換のレイヤをもって
います。

macOS上のターミナルで、bash等のシェルを
介して、BSDレイヤの機能を利用しているユース
ケースでは、Linuxとの差異を感じることは
ほとんど、ありません。

両者にネイティブコードレベルでの互換性は
皆無ではあるものの、macOSでの実装において、
BSDレイヤのAPIのうちLinuxと互換性のあるもの
を利用するか、両者の上で動作する両者の差異を
吸収するライブラリを利用している、タイプの
プログラムであれば、ネイティブアプリであって
もソースコードレベルでの互換性を実現することは
可能です。

macOSは、CoreFoundation(C)とそれをラップ
したFoundation(Objective-C、Swiftに移行
予定?)というライブラリを持ち、その上に
AppKit、Mac Catalyst etcのライブラリ群が実装
されています。

これらのライブラリ群とその上に実装された
ツール群が、macOSをmacOSたらしめ、
Linuxとは全くの別物にしています。

オマケ

WindowsとLinuxは、上層から下層に至るまで、
全くの別物です、互換部分はどこにもありません。

Windows上でLinuxアプリを動かすしくみに
WSLがあります。

WSL1はLinuxカーネルのシステムコールを
Windowsカーネルのシステムコールに置き換えて
実行する荒技的な実装となっていましたが、
WSL2では、Windows10に搭載された軽量仮想
マシンを利用して、仮想マシン上でカスタマイズ
したLinuxカーネルを動かす形に変更されて
います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

超楽ちんVPN WireGuard

超楽ちんだった。
自身の備忘録として残しておく。

前書き

AWSでSSHDのポート替えたりFail2Ban設定や、AWSのセキュリティグループこねたりするのは嫌だなーということで、ここ最近流行りのWireGuardを使ってみました。

これ、まじに楽でした。

環境

  • Amazon Linux の マイクロインスタンス1つ
  • VPCで設定したサブネット
    • 172.31.0.0/20
    • 172.31.16.0/20
    • 172.31.32.0/20
  • WireGuardのポート (51820/udp)
  • DDNSは hoge.example.jp
  • 俺ん家のPCはWindows10
  • WireGuardのネットワークは 192.168.90.0/24
  • WireGuardサーバーのVPN上のIPは 192.168.90.1
  • WireGuardクライアントのVPN上のIPは 192.168.90.10

ざっくりネットワーク

WireGuardで俺ん家からAWSにアクセスするざっくりイメージのネットワーク図。

network-wg1.png

サーバー側

EC2インスタンス

ここでは Amazon Linux 2 のマイクロインスタンスを利用。

$ cat /etc/os-release
NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora"
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2"
HOME_URL="https://amazonlinux.com/"

AWSのセキュリティグループ

AWSのセキュリティグループを1つ作成して、WireGuardのEC2インスタンスに割り当てておきます。
しばらくはSSHアクセスをして作業します。
WireGuardが使えるようになったらSSHの項目は削除します。

タイプ プロトコル ポート範囲 ソース 説明
SSH TCP 22 0.0.0.0/0
カスタム UDP ルール UDP 51820 0.0.0.0/0 wireguard-port

DDNSを設定

先にno-ipを取得してDDNSのドメインを作成しておきます。
DDNSドメイン取得後、yumnoipをインストールしてnoip2 -Cでユーザーとパスワードを設定します。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/dynamic-dns.html

$ yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
$ yum install -y noip
$ /usr/sbin/noip2 -C
$ systemctl enable noip

WareGuardインストール

公式サイトのRHEL7用のリポジトリを利用。
https://www.wireguard.com/install/

$ curl -o /etc/yum.repos.d/jdoss-wireguard-epel-7.repo https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-7/jdoss-wireguard-epel-7.repo
$ yum install wireguard-dkms wireguard-tools

念の為、一回再起動しておく。

$ reboot

ipforwardの設定

フォワーディングを有効にします。

$ cat /etc/sysctl.conf | grep -v ^#
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1

$ sysctl -w net.ipv4.ip_forward=1
$ sysctl -w net.ipv6.conf.all.forwarding=1

etckeeperインストール

/etc以下の設定ファイルをこねるのでetckeeper入れておく。

$ yum install etckeeter
$ etckeeper  init
Initialized empty Git repository in /etc/.git/

サーバー用秘密鍵公開鍵作成

サーバー用秘密鍵作成

$ wg genkey | tee /etc/wireguard/server.key
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=
$ chmod 600 /etc/wireguard/server.key

サーバー用公開鍵作成

$ cat /etc/wireguard/server.key | wg pubkey | tee /etc/wireguard/server.pub
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
$ chmod 600 /etc/wireguard/server.pub

クライアント用秘密鍵公開鍵作成

クライアント用秘密鍵作成

$ wg genkey | tee /etc/wireguard/client.key
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=

クライアント用公開鍵作成

$ cat /etc/wireguard/client.key | wg pubkey | tee /etc/wireguard/client.pub
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=

WireGuardサーバーの設定

まず最初に ip addr コマンドでNICを確認しておきます。
NICはeth0というの覚えておきます。

$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    link/ether 06:9a:51:f1:23:ca brd ff:ff:ff:ff:ff:ff
    inet 172.31.45.164/20 brd 172.31.47.255 scope global dynamic eth0
       valid_lft 2382sec preferred_lft 2382sec
    inet6 fe80::49a:51ff:fef1:23ca/64 scope link
       valid_lft forever preferred_lft forever

/etc/wireguard/wg0.confを作成をします。

$ cat /etc/wireguard/wg0.conf
[Interface]
# server-private-key
PrivateKey = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=
Address = 192.168.90.1
ListenPort = 51820
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
# clients-public-key
PublicKey = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=
AllowedIPs = 192.168.90.0/24

設定の項目の意味はこんなかんじ。

  • [Interace]

    • PrivateKey: サーバー用の秘密鍵
    • Address: WireGuardサーバーのIPアドレスを指定
    • ListenPort: WireGuardのポートを指定
    • PostUp: IPマスカレードができるようにiptablesコマンドでルールを追加 先ほど確認したNICを指定すること
    • PostDown: 停止時にPostUpで設定したiptablesのルールを削除するように設定
  • [Peer]

    • PublicKey: クライアント用の公開鍵
    • AllowedIPs: WireGuardで利用するネットワークアドレス

設定が終わったらWireGuardを起動+自動起動します。

$ systemctl enable --now wg-quick@wg0

WireGuard用のDNSサーバー

AWSのip-172-31-47-99.ap-northeast-1.compute.internalのこんなFQDNを解決したいのでunboundをインストールしておく。

$ yum install unbound

AWSのnameserverのIPを覚えておく。

$ cat /etc/resolv.conf | grep ^namese
nameserver 172.31.0.2

/etc/unbound/unbound.confをこんな感じにしておく。

$ cat /etc/unbound/unbound.conf | grep -v ^$
server:
        interface: 0.0.0.0
        interface-automatic: yes
        do-ip4: yes
        do-ip6: no
        access-control: 0.0.0.0/0 allow
        access-control: 127.0.0.1 allow
        #verbosity: 5
        verbosity: 1
        private-domain: "shikumis.com"
remote-control:
        control-enable: yes
        # control-port: 8953
        server-key-file: "/etc/unbound/unbound_server.key"
        # unbound server certificate file.
        server-cert-file: "/etc/unbound/unbound_server.pem"
        # unbound-control key file.
        control-key-file: "/etc/unbound/unbound_control.key"
        # unbound-control certificate file.
        control-cert-file: "/etc/unbound/unbound_control.pem"
# Stub and Forward zones
include: /etc/unbound/conf.d/*.conf
forward-zone:
        name: "."
        forward-addr: 172.31.0.2

unboundを起動+自動起動。

$ systemctl enable --now unbound

クライアント側

WindowsのWireGuardクライアントをインストール

ここからWindowsのインストーラをダウンロードしてインストール。
https://www.wireguard.com/install/

WireGuardクライアントの設定

WireGuardクライアントを立ち上げ、左下の「トンネルの追加」-> 「空のトンネルを追加」にて以下の設定を行う。

[Interface]
# client-private-key
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
Address = 192.168.90.10/32
DNS = 192.168.90.1

[Peer]
# server-public-key
PublicKey = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
AllowedIPs = 192.168.90.1/32, 172.31.16.0/20, 172.31.32.0/20, 172.31.0.0/20
Endpoint = hoge.example.jp:51820
PersistentKeepalive = 25

設定の項目の意味はこんなかんじ。

  • [Interface]
    • PrivateKey: クライアント用の秘密鍵
    • Address: クライアントのIPアドレス
    • DNS: DNSサーバー (ここでは192.168.90.1を指定. unboundが面倒ならAWSのnameserverを指定してもよい)
  • [Peer]
    • PublicKey: サーバー用の公開鍵
    • AllowedIPs = アクセスを許可するネットワーク
    • Endpoint: WireGuardサーバーを指定(取得したDDNSのドメインを指定するのが便利)
    • PersistentKeepalive: NATを保持する時間

接続確認

GUIで「有効化」をクリックして接続。
wireguqard-01.png

コマンドプロンプトで名前解決やルーティングを確認。

>nslookup ip-172-31-47-99.ap-northeast-1.compute.internal
サーバー:  UnKnown
Address:  192.168.90.1

権限のない回答:
名前:    ip-172-31-47-99.ap-northeast-1.compute.internal
Address:  172.31.47.99

>route print -4 | findstr /i 172.31
       172.31.0.0    255.255.240.0            リンク上     192.168.80.11      5
    172.31.15.255  255.255.255.255            リンク上     192.168.80.11    261
      172.31.16.0    255.255.240.0            リンク上     192.168.80.11      5
    172.31.31.255  255.255.255.255            リンク上     192.168.80.11    261
      172.31.32.0    255.255.240.0            リンク上     192.168.80.11      5
    172.31.47.255  255.255.255.255            リンク上     192.168.80.11    261
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む