20200117のLinuxに関する記事は3件です。

LinuxをWDSで起動してみる (iPXE for Boot a Linux via Network on Windows Server)

WindowsServerのWDSを使用し、LiveCD LinuxをPXEブートさせる


Windows Server 2019(2016でも可能)で、以下のサービスをインストール
・DHCP Server
・Web Server (IIS)
・Windows Deployment Services
image.png

undionly.kpxe と memdisk.bin ファイルを https://www.ipxe.org/download/ からダウンロードし、作成する。
menu.ipxeを作成(以下、例)
initrd http://10.0.0.1/Images/CentOSlivecd.iso
chain memdisk.bin iso raw

boot.ipxeを作成(以下、例)
chain --replace --autofree http://10.0.0.1/Images/menu.ipxe ||

WDSサービスを設定し起動する
image.png

DHCPサービスで、新しいスコープを追加する
image.png

スコープオプションで066 Boot Server Host Nameを追加、サーバーIPを入力する
image.png
image.png

ユーザークラスにiPXEを追加する
image.png
image.png

新しいポリシー(iPXE Policy)を追加、User Class, Equals, iPXEおよび067で\Boot\x86\boot.ipxeを設定する
image.png
image.png
image.png

IISのVertial Directoryで、Default Web Siteで以下を追加する
image.png

MIMEタイプでisoとipxeを追加する
image.png
image.png

以下のファイルを \RemoteInstall\Boot\x86 フォルダへコピー
・undionly.kpxe
・boot.ipxe

以下のファイルを、 \RemoteInstall\Boot\x86\Images フォルダへコピー
・menu.ipxe
・memdisk.bin
・起動したいLinuxイメージ.iso

WDS上のWDS serverのプロパティで、以下のように設定する
image.png

管理者権限のコマンドプロンプトで、以下を実行する
 wdsutil /set-server /bootprogram:Boot\x86\undionly.kpxe /Architecture:x86
 wdsutil /set-server /bootprogram:Boot\x86\undionly.kpxe /Architecture:x64
 wdsutil /set-server /N12bootprogram:Boot\x86\undionly.kpxe /Architecture:x86
 wdsutil /set-server /N12bootprogram:Boot\x86\undionly.kpxe /Architecture:x64
image.png

That's all :D


OMAKE

menu.ipxeと同じフォルダにpngファイルを入れ、menu.ipxe内に
console --picture background.png
と指定しておくと、iso読込中に、画像表示できる
他には、iso複数指定したい場合は、
以下のようにmenu.ipxeを作成すればOK

set server 10.0.0.1
console --picture background.png

:start
menu === BOOT MENU ===
item --key a Linux1 Linux_1st_image
item --key b Linux2 Linux_2nd_image
choose --default Linux1 --timeout 10000 target && goto ${target}
goto ${selected}

:cancel
echo canceled

:failed
echo FAILED...
goto shell

:back
set submenu-timeout 0
clear submenu-default
goto start

:Linux1
initrd http://${server}/Images/Linux1.iso

chain memdisk.bin iso raw || goto failed
goto start

:Linux2
initrd http://${server}/Images/Linux2.iso
chain memdisk.bin iso stack=80000 || goto failed
goto start

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

SereneLinux(Ubuntu18.04 Desktop)でSoftwareRAID0

SereneLinuxをRAID0にインストールするという備忘録です。応用次第でRAID1とかもできると思います。

SereneLinuxについて

日本人が開発しているubuntu18.04ベースのLinuxです。
SereneLinuxのホームページ

RAID0の構築

RAID0の構築について。今回は、mdadmで作ったRAID0をルートパーティションとして使用します。

パーティションの作成

今回は128GBと120GBのSSD、2つでRAIDを構築します。
RAID0の場合、必要なパーティションは、下の3つです。(RAID1の方は別途調べてください。)

  • EFIパーティション
  • ブートパーティション
  • RAID用パーティション

今回は128GBのSSDを、下のように分けます。

  • EFIパーティション 128MiB
  • ブートパーティション 700MiB
  • RAID用 残り全部

120GBの方は全てRAID用パーティションとして使います。
今回はGpartedで作成しました。

注意

  • EFIパーティションを作るときは、FAT32で作成して、フラグをboot,espに設定してください。
  • ブートパーティションは、EXT4で作成してください。

RAIDの作成

大抵のubuntuベースのLiveCDにはmdadmが入ってません。
そこでまず、mdadmをインストールします。

$ sudo apt update && sudo apt install mdadm

次にRAIDを構築します。

$ sudo mdadm -C /dev/md0 -l[RAIDのレベル] -n[デバイスの数] [RAID用パーティション1] [RAID用パーティション2]

RAID0の場合は、"-l"の後ろの数字を"0"にしてください。
2つのディスクでRAIDを構築する場合は、"-n"の後ろの数字をディスクの数にしてください。
"-n"の後ろにRAIDで使用するパーティションを指定してください。
今回は作成したRAID0をXFSでフォーマットしました。
ファイルシステムはお好みのを使用してください。(分からなかったら、EXT4が無難です。)

インストール

インストーラを起動して指示に従ってインストールしてください。
終わったら、"試用を続ける"を選択してください。

インストール後の設定

このまま再起動すると起動しないので、再起動する前にシステムをいじる必要があります。
chrootでシステムをいじるれるよう準備します。

$ sudo mount [作成したルートパーティション] /mnt
$ sudo mount [作成したブートパーティション] /mnt/boot
$ sudo mount [作成したEFIパーティション] /mnt/boot/efi
$ sudo mount -t proc none /mnt/proc
$ sudo mount --bind /dev /mnt/dev
$ sudo mount --bind /sys /mnt/sys
$ sudo mount --bind /run /mnt/run

chrootでシステムに入ります。

$ sudo chroot /mnt

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

# apt update && apt install mdadm

ここで、mdadmのインストールに失敗したら
$ sudo cp /etc/resolv.conf /mnt/etc

chrootから出て、上のコマンドを実行すると成功するかもしれません。

一旦、chrootから出て、/mnt/etc/mdadm/mdadm.confを編集します。

$ sudo mdadm -D --scan >> /mnt/etc/mdadm/mdadm.conf

再び、chrootに入って

$ sudo chroot /mnt

initramfsの更新とgrubのインストールを行います。

# update-initramfs -u && grub-install [EFIパーティション]

これで再起動して、起動すれば成功です。

まとめ

正直、RAID0をルートパーティションとして使用する人いる?
Q:そもそもなんで、ubuntu serverとかFedoraとかArchとか使わないの?
A: 長いので、知りたい人だけ見てください。↓

なんでこんなことしようと思ったの?
要約するとintelとNECのせい。
自分の使っているノートパソコンにintelのwifiが乗っているのだが、これがNECのルーターと相性が最悪なのである。windowsのときはなぜか大丈夫だったのだが、Arch、Fedora、debianと試してみたのだが、インターネットを使うとwifiが切れる。これだけならまだ許容範囲。
しかし、何故かルーターを再起動しないとルーターがインターネットに繋がらなくなるという結構ヤバイ不具合を引き起こすのである。
(なぜかubuntuは大丈夫だったので今は、ubuntuベースのSereneLinuxを使ってます。)
(個人的にはカーネルが原因かなと思っている。)
Server版使えば?
まぁ、こういう話になるが、新しいのも古いのもインストーラーがwifiを認識しない。
なので、こういうことをすることになりました。みんなも気をつけよう相性問題。

SereneLinuxの感想

  • 軽い
  • SetupとかStartdashとかがLinux初心者には良いと思った。

今まで、ubuntuとかzorinとかPop!_osとか色々つかってきましたが、gnomeじゃないので軽い。
zorin liteとかxubuntuとかのxfceデスクトップのディストロもありますが、zorin liteは目玉のzorin appearanceが使えないという不具合がありました。
(そもそも色が合わなかったでやめました。(ダーク+ブルーって見づらいね。))
スタイリッシュなxfceのディストロが増えたのは個人的には嬉しいです。(xubuntuはダサかったので論外

ただのわがまま

ubuntuにもFedoraみたいにデスクトップ版でもRAIDが簡単にできるといいなぁ

参考

http://blog.seishiono.net/entry/2014/05/03/223948
https://askubuntu.com/questions/469209/how-to-resolve-hostnames-in-chroot
https://wiki.archlinux.org/index.php/Chroot#Using_chroot
https://ankyo.blog.ss-blog.jp/2011-10-24

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

【C言語】Linuxでのcrypt関数の使用法【パスワードハッシュ化】

0.はじめに

使う機会があり調べたことをまとめる。
Linuxの機能を用いているらしいため、他の言語で使ったことがある人は多分同じ感覚で使えると思う。

筆者のテスト環境
Ubuntu 18.04.3 LTS
コンパイラ gcc 7.4.0

crypt()関数とcrypt_r()関数の二つがあるが、crypt_r()関数はcrypt()関数のリエントラント版、
つまりcrypt()関数はマルチスレッド安全でない一方、crypt_r()関数はマルチスレッド安全である。
2つの関数についてそれぞれ使用例を挙げた後、解説をしようと思う。

注:crypt関数の仕様はOSによって異なるので、正確な内容を知りたい場合はman 3 cryptコマンドを使ってマニュアルを読んでください。
以下の内容はGNU/Linux(Ubuntu18.0.4)での話です。

1.crypt()関数

プロトタイプ宣言は次の通り。
char *crypt(const char *key, const char *salt);
key はハッシュ化したい文字列、
saltはハッシュ化の際に使用する文字列。

戻り値は、
idを指定しなかった場合はハッシュ化されたkey,
idを指定した場合、 (saltの文字列) + "$" + (ハッシュ化されたkey)。
(idについては後述。)

1.1 crypt()関数の使用例

crypt_test.c
#include<crypt.h>
#include<stdio.h>
#include<string.h>
#define BUFSIZE 1024

int main(void){
  char key[BUFSIZE] = "key"; // ハッシュ化したい文字列
  char salt_origin[BUFSIZE] = "example"; //ソルトの文字列
  char salt[BUFSIZE]; 
  char encrypted[BUFSIZE]; // 結果格納用

  sprintf(salt, "$6$%s", salt_origin); // ソルトの整形、id指定(後述)
  strcpy(encrypted, crypt(key, salt)); //encrypted変数には、
                                       //文字列"$6$example$(ハッシュ化されたkey)"が格納される

  printf("%s\n", encrypted);
}

コンパイルの際には-lcryptオプションをつけること。

2.crypt_r()関数

プロトタイプ宣言は次の通り。
char *crypt_r(const char *key, const char *salt, struct crypt_data *data);

crypt_data構造体はcrypt.hヘッダファイル内で定義されており、ハッシュ結果保存のために使用される。


crypt_data構造体の定義
struct crypt_data
{
char keysched[16 * 8];
char sb0[32768];
char sb1[32768];
char sb2[32768];
char sb3[32768];
char crypt_3_buf[14];
char current_salt[2];
long int current_saltbits;
int direction, initialized;
};

crypt_data構造体の変数は、1度目のcrypt_r()関数使用でその構造体変数を渡す前にinitializedメンバ変数を0にする必要がある。
keyschedメンバ変数にはハッシュ化した後のkeyが格納される。

2.1.crypt_r()関数の使用例

crypt_r_test.c
#define _GNU_SOURCE // crypt_r()関数を使用するためには、このマクロ定義を
                    //どのファイルのインクルードよりも前に記述する必要がある
#include<crypt.h>
#include<stdio.h>

#define BUFSIZE 1024

int main(void){
  char key[BUFSIZE] = "key"; // ハッシュ化したい文字列
  char salt_origin[BUFSIZE] = "example"; // ソルト。
  char salt[BUFSIZE];

  struct crypt_data data; // ハッシュ結果保存のために必要な構造体
  data.initialized = 0; // crypt_r()関数使用の前に行う必要有り。

  sprintf(salt, "$5$%s", salt_origin); // id指定(後述)

  crypt_r(key, salt, &data);
  printf("%s\n", data.keysched); //keyschedメンバ変数には、
                                 //文字列"$5$example$(ハッシュ化されたkey)"が格納される
}

コンパイルの際には-lcryptオプションをつけること。

2.2._GNU_SOURCEについて

crypt_r()関数を使うには、マクロ定義#define _GNU_SOURCEどのヘッダファイルのインクルードよりも前に行う必要がある。
ソースコードの最初に記述しておくのが無難である。
自分で定義したヘッダファイルを使用する際には、インクルードガードの直後に記述するのが無難である。


もしくは、
マクロ定義はコマンドラインからも行えるのでそちらで行ってもよい。
-D<マクロ名>[=値] というオプションをコンパイル実行時に渡してやればよい。
 例えば、コンパイル時に-DN=2というオプションを渡すのは、#define N 2をソースコード内で記述するのと同じ意味になる。
 今回の場合で言えば、#define _GNU_SOURCEをソースコードの最初に記述する代わりに、コンパイル時に-D_GNU_SOURCEというオプションを付け加えてもよい。
Makefileを使うならばこちらでもよいのではないだろうか。

3.saltについて

仕様可能文字は[a-zA-Z0-9./]。小文字のアルファベット、大文字のアルファベット、数字、'.'と'/'である。

crypt関数に渡すsaltのフォーマットを整えることによって、ハッシュアルゴリズムを指定することができる。
saltを$(id)$(saltの文字列)$という風にする。
idはハッシュアルゴリズムを指定するための番号である。(ハッシュアルゴリズムについては後述)
(ちなみにsaltの文字列の最後の$マークは省略可能である。)

例. salt = "$5$example";
この例では、ハッシュアルゴリズムをSHA-256で指定し、saltの文字列として"example"を指定している。

idを指定せずに文字列だけ渡すとDES方式でハッシュ化される。

3.1.saltのidとハッシュアルゴリズム

  • idとハッシュアルゴリズムの対応表
id ハッシュアルゴリズム
1 MD5
2a Blowfish(OSによっては使用できない可能性有)
5 SHA-256
6 SHA-512

無指定だとDESになる。DESはSaltを2文字しか使用せず、パスワードは8文字までしか認識しないため、とても脆弱であり、使用は推奨されない。

  • ハッシュ化後の文字列の文字数
ハッシュアルゴリズム ハッシュ化後の文字列の文字数
MD5 22文字
SHA-256 43文字
SHA-512 86文字
  • saltの文字数
    DES:2文字固定 (saltの文字列の先頭二文字のみ見る、それ以降の文字は無視される )
    MD5:8文字以内 (saltの文字列の先頭8文字のある分だけ見る、それ以降の文字は無視される)

ハッシュアルゴリズムの安全性について、
DES<MD5<SHA-256<SHA-512
と、idの数字が大きくなるほど安全性は高くなる。

4.終わりに

コンパイル時には-lcryptオプションを忘れないこと。

何か間違いなどございましたらご指摘ください。

5.参考

https://linuxjm.osdn.jp/html/LDP_man-pages/man3/crypt.3.html
https://blog.amedama.jp/entry/unix-crypt-3

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