20200823のLinuxに関する記事は5件です。

ssh-keygenを用いて秘密鍵と公開鍵を作る(Windows10とLinuxの違い)

1. はじめに

 秘密鍵と公開鍵を作成するにあたって、Linuxを用いるか何かしらのソフトウェアの導入が必要と思い込みをしていました。が、恥ずかしながらつい先日Windows10に標準でOpenSSHがインストールされている(ssh-keygenコマンドが使える)ことを知り衝撃を受けました。Linux版とほぼ同じようなのですが、Windows版固有の違いが見られたので紹介します。

2. 作成方法

 秘密鍵と公開鍵を作成する際にパスフレーズとコメントを埋め込むことができますが、私は必要ないと考えているので、ssh-keygenのパラメータにて空文字を指定します。

2.1. Linuxの場合

linuxですと以下の通りとなります。
※二つのファイル(id_rsa:秘密鍵、id_rsa.pub:公開鍵)が生成されます。

$ cd 【秘密鍵と公開鍵を生成したい場所】
$ ssh-keygen -q -t rsa -b 4096 -C '' -N '' -f id_rsa

2.2. Windowsの場合(コマンドプロンプト)

WindowsのコマンドプロンプトでLinux版のコマンドをそのまま実行すると、 エラー になります。。。

>cd 【秘密鍵と公開鍵を生成したい場所】
>ssh-keygen -q -t rsa -b 4096 -C '' -N '' -f id_rsa
Saving key "id_rsa" failed: passphrase is too short (minimum five characters)

エラーメッセージ的には、パスフレーズが短すぎますとのことなのですが、実は空文字指定が正しく認識されていないことが原因です。空文字指定をしたい場合は、正しくは以下のようにコマンドを打つ必要があります。

>cd 【秘密鍵と公開鍵を生成したい場所】
>ssh-keygen.exe -q -t rsa -b 4096 -C "" -N "" -f id_rsa

2.3. Windowsの場合(PowerShell)

 PowerShellを使用すると上記コマンドでも エラー になります。

>cd 【秘密鍵と公開鍵を生成したい場所】
>ssh-keygen.exe -q -t rsa -b 4096 -C "" -N "" -f id_rsa
Enter passphrase (empty for no passphrase):  ← え・・・。

正しくは、以下の通りです。

>cd 【秘密鍵と公開鍵を生成したい場所】
>ssh-keygen.exe -q -t rsa -b 4096 -C '""' -N '""' -f id_rsa

3. おわりに

Windowsにおいても使えるLinuxコマンドが増えてきていることは歓迎なのですが、今回のケースのようにちょっとした違いで躓くこともあるように思います。本記事がどなたかの一助になれば幸いです。

参考

Automate ssh-keygen -t rsa so it does not ask for a passphrase
お前らのSSH Keysの作り方は間違っている

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

iptables の使い方

はじめに

iptables は Linux カーネルに組み込まれているファイアウォールです。そのホストの通信を制限したり、転送したりする目的で使用します。なお、ここでは IPv4 を前提にしていますが、IPv6 にもほぼ同じ使い方の ip6tables があります。

設定例

細かい説明は後回しにして iptables の設定ファイルの例を示します。

/etc/iptables/iptables.rules
# 原則として入力・転送は全て禁止
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

# ループバックからの接続は全て許可
-A INPUT -i lo -j ACCEPT

# PING の受信を許可するが頻度はクライアント辺り 1 秒に 1 回程度に制限
-A INPUT -p icmp --icmp-type echo-request -m hashlimit --hashlimit-name t_echo --hashlimit-mode srcip --hashlimit-upto 1/s --hashlimit-burst 5 --hashlimit-htable-expire 10000 -j ACCEPT

# 既に確立した通信はポート番号に関係なく許可
-A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

# SSH 接続を許可するが頻度はクライアント辺り 1 分間に 1 回程度に制限
-A INPUT -m state --state NEW -m tcp -p tcp --syn --dport 22 -m hashlimit --hashlimit-name t_sshd --hashlimit-mode srcip --hashlimit-upto 1/m --hashlimit-burst 5 --hashlimit-htable-expire 600000 -j ACCEPT

# DNS サーバーからのレスポンス受信を許可
-A INPUT -p udp --sport 53 -j ACCEPT

COMMIT

解説

ポリシー

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

原則としてパケットの受信と転送は全て禁止し、送信は許可するように設定します。もちろん、全くパケットを受信できないのは困るので、このポリシーの例外をこの後ろに設定していきます。

ループバック

# ループバックからの接続は全て許可
-A INPUT -i lo -j ACCEPT

Linux では他のホストとの通信だけではなく、プロセス間の通信に socket が使用されることがあります。このようなホストに閉じた通信のことをループバックと呼びます。ループバックの通信を制限してしまうといろいろなプログラムが正常に動作しなくなる可能性が高いので、全面的に許可しています。

Ping

# PING の受信を許可するが頻度はクライアント辺り 1 秒に 1 回程度に制限
-A INPUT -p icmp --icmp-type echo-request -m hashlimit --hashlimit-name t_echo --hashlimit-mode srcip --hashlimit-upto 1/s --hashlimit-burst 5 --hashlimit-htable-expire 10000 -j ACCEPT

ホストが Ping に応答できるようにしています。ただし、大量の Ping を送信することでシステムに負荷を加える ICMP Flood (Ping Flood) への対策として、その頻度を制限しています。パケットを受信(あるいは転送や送信)する頻度を制限には hashlimit モジュールを使用します。

--hashlimit-name はハッシュテーブルの名前です。このモジュールを使用するためにはパケットの受信履歴などを記録する必要があるため、その保存先のファイル名を他のルールと重複しないように設定します。

--hashlimit-mode はどのような単位でパケットを受信する頻度を制限するかを指定します。ここでは srcip を設定しているため送信元の IP アドレスごとにパケットの受信を制限することになります。他に dstip srcport dstport などのフラグがあります。複数のフラグの組み合わせも可能です。このオプションを省略した場合は送信元や受信先には関係なく、システム全体としてパケットを受信する頻度を制限することになります。

--hashlimit-upto--hashlimit-burst には具体的にどのような頻度までパケットの受信を許可するかを設定します。この 2 つの設定値の意味を理解するには、パケットの受信が許可される頻度をバケツの容量に例えるとわかりやすいと思います。1 回のパケットを受信するためにはバケツから 1 リットルの水を取り出す必要があると考えてください。システムはバケツが満水の状態で起動しますが、水が不足するとパケットを受信できなくなります。--hashlimit-upto 1/s は 1 秒間に 1 リットルの水をバケツに注いでいることを意味します。ただし、--hashlimit-burst 5 はバケツの容量が 5 リットルしか無いことを意味します。つまり、どんなに短い周期でパケットが到着しても 5 回までは問題なく受信できますが、それ以上連続してパケットを受信するためには再びバケツに水が貯まるまで待たなければならないということです。

--hashlimit-htable-expire にはハッシュテーブルのレコードの期限をミリ秒単位で指定します。$\frac{hashlimit-burst}{hashlimit-upto}$ よりも大きな値を設定しなければ受信頻度が期待通りに制限されません。ここでは余裕をもって計算結果 (5 秒) の 2 倍に相当する 10000 ミリ秒に設定しています。

TCP

# 既に確立した通信はポート番号に関係なく許可
-A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

TCP で 1 度接続を確立した後は、そのポートで任意のパケットを受信することを許可します。後述する SSH サーバーの設定はあくまでもサーバーへの接続を許可するものですが、この設定により接続に成功した後の通信もファイアウォールを通過します。

また、自分がクライアントとしてサーバーに接続することは前述の :OUTPUT ACCEPT [0:0] で許可されていますが、接続に成功した後にパケットを受信できるのはこの設定のおかげです。

SSH サーバー

# SSH 接続を許可するが頻度はクライアント辺り 1 分間に 1 回程度に制限
-A INPUT -m state --state NEW -m tcp -p tcp --syn --dport 22 -m hashlimit --hashlimit-name t_sshd --hashlimit-mode srcip --hashlimit-upto 1/m --hashlimit-burst 5 --hashlimit-htable-expire 600000 -j ACCEPT

TCP の 22 番ポートへの接続を許可します。Ping と同じように hashlimit モジュールを使用して接続の頻度を制限しています。--dport 22 を他のポート番号に変更すれば他の用途にも応用できます。例えば HTTP なら 80 番を、HTTPS なら 443 番ポートの通信を許可してください。ただし、HTTP や HTTPS ではもう少し hashlimit の制限を緩く設定するべきです。

DNS クライアント

# DNS サーバーからのレスポンス受信を許可
-A INPUT -p udp --sport 53 -j ACCEPT

DNS は TCP/UDP のどちらかあるいは両方を使用します。TCP については :OUTPUT ACCEPT [0:0] -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT の設定で既に許可されています。UDP については接続の概念が存在しないので、明示的に 53 番ポートから送信されたパケットを受信できるように許可する必要があります。

設定の反映

iptables を再起動してください。Arch Linux など systemd を使用している場合は以下の通りです。

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

【Linux】初心者が知るべきLinuxコマンドのリスト

はじめ

 最近、Linuxを勉強し始めました。
 CUIを操作できるように、まずコマンドを覚えなければなりません。
 下記のコマンドはよく使われますので、まとめました。
 初心者の勉強や復習などに役立つと思います。

Linux コマンド

 1. コマンドのレファレンスマニュアルを表示するコマンド

コマンド 意 味 使用例
man コマンドのレファレンスマニュアルを表示する $ man コマンド名
info コマンドのレファレンスマニュアルを表示する $ info コマンド名
  • ↑、↓、PgDn、PgUpを押せば、説明文章を画面をスクロールする。
  • 「q」を押せば、コマンドの説明を終了する。

 2. ファイル/ディレクトリを操作するコマンド名

コマンド 意 味 使用例
ls ファイルやディレクトリの情報を表示する $ ls
touch 内容の入っていないファイルを新規作成する $ touch ファイル名
cp ファイルやディレクトリをコピーする $ cp コピー元 コピー先
mv ファイル・ディレクトリを移動する $ mv 元のファイル(ディレクトリ) 変更後のファイル(ディレクトリ)名
ファイル・ディレクトリの名称を変更する $ mv 元のファイル(ディレクトリ) 移動するディレクトリ
rm ファイルやディレクトリを削除する $ rm ファイル名
cat ファイルを閲覧する $ cat ファイル名
more テキストファイルを1画面ずつ表示する $ more ファイル名
head テキストファイルの最初の10行を表示する $ head ファイル名
tail 最後の10行を表示する $tail ファイル名
wc テキストファイルの行数や単語数(word count)、文字数を数える $ wc テキストファイル名
ln ディレクトリやファイルへのリンクを登録する $ ln リンク元 登録名
whereis パスを検索する $ whereis コマンド名
find ファイルやディレクトリ(フォルダ)を検索する $ find ファイル名
grep ファイルに特定の文字列が存在するか検索する $ grep 検索文字列 ファイル名
pwd 操作しているディレクトリを表示する $ pwd
cd カレントディレクトリ(現在 作業中のディレクトリ)を移動する $ cd ディレクトリ
mkdir ディレクトリを新規作成する $ mkdir ディレクトリ名
rmdir ディレクトリを削除する $ rmdir ディレクトリ名
tree ディレクトリやファイルをツリー状に表示する $ tree

 3. 情報を表示するコマンド

コマンド 意 味 使用例
stat 属性や日付などを表示する $ stat ファイル名
who システムに誰がログインしているかを表示する $ who
w システムに誰がログインしているかを表示する $ w
whoami 現在の実効ユーザー、id、に対応するユーザー名を表示する $ whoami
hostname ホスト名を表示する $ hostname
uname システム情報を確認する $ uname
dmesg カーネルのリングバッファの内容を表示・制御する $ dmesg
top 現在実行中のプロセスをCPU利用率が高い順に表示する $ top
du ディスクの使用量をディレクトリごとに集計して表示する $ du
df ディスクの空き領域(freeスペース)のサイズを集計して表示する $ df
free メモリの利用状況を調べる $free
ifconfig ネットワークの接続状況が確認する $ ifconfig
ping 指定したホストとの間でネットワークが疎通(そつう)しているかどうかを調べる $ ping 接続先IPアドレスまたはホスト名
netstat ホストのネットワーク接続状態やソケット・インターフェイスごとのネットワーク統計などを表示する $ netstat
locale 現在のロケールと使用可能なロケールの情報を表示する $ locale
id 識別情報を表示する $ id ユーザー名

終わり

 以上は、よく使われるLinuxコマンドです。
 ファイルの圧縮、解凍のコマンドを記入してないです。
 
 

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

Linux tar xz のコマンドメモ

tar.gz

圧縮
tar -zcvf xxxx.tar.gz directory
解凍
tar -zxvf xxxx.tar.gz

tar.bz2

圧縮
tar -jcvf xxxx.tar.bz2 directory
解凍
tar -jxvf xxxx.tar.bz2

tar.xz

圧縮
tar -Jcvf xxxx.tar.xz directory
解凍
tar -Jxvf xxxx.tar.xz

tar

圧縮
tar -cvf xxxx.tar directory
解凍
tar -xvf xxxx.tar

zip

圧縮
zip -r xxxx.zip directory
解凍
unzip xxxx.zip

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

Linuxコマンド集

よく使うLinuxコマンドをジャンル別にまとめていこうと思います。
環境:CentOS

基本操作

# ▽clear【概要】画面のクリア【Tips】[Control] + [L] でも可)
clear

# ▽pwd (print working directory)【概要】現在のディレクトリパスを表示
pwd

# ▽cd (change directory)【概要】ディレクトリを移動する
cd          # 現在ログインしているユーザのホームディレクトリへ移動する
cd -        # 一つ前のディレクトリに戻る
cd ..       # 一つ上の階層に移動する
cd /etc/ssh # パスを指定して移動する

# ▽history【概要】コマンドの履歴を見る。
history
!30    # history の実行結果に表示された  30 のコマンドを実行する
!254   # history の実行結果に表示された 254 のコマンドを実行する

日付・時間

# ▽date【概要】現在の日時を表示する
date                      # => Sat Aug 12 08:50:30 JST 2017
date +%Y/%m/%d            # => 2017/08/12
date +"%Y %m %d %H %M %S" # => 2017 08 12 08 50 30
date +"%Y-%m-%d %H:%M:%S" # => 2017-08-12 08:50:30

# ▽cal【概要】カレンダーを表示する
cal         # コマンド実行月のカレンダーが表示される
cal 2020    # 2020年        のカレンダーが表示される 

ユーザ管理

# ▽id【概要】ユーザーの情報を表示する
id          # ログインしてるユーザーの情報を表示する
id apache   # apache  ユーザーの情報を表示する => uid=48(apache) gid=48(apache) groups=48(apache)
id hogehoge # hogehogeユーザーの情報を表示する => uid=1000(hogehoge) gid=1000(hogehoge) groups=1000(hogehoge)

# ▽useradd【概要】ユーザーを追加する【Tips】管理者権限を持つユーザーで実行する必要有り
useradd hogehoge                # hogehogeユーザーを追加する
cat /etc/passwd | grep hogehoge # 確認

# ▽passwd【概要】ユーザーのパスワードを設定、変更する
passwd hogehoge    # hogehogeユーザーのパスワードを変更する
passwd -S hogehoge # hogehogeユーザーの状態確認

# ▽usermod【概要】ユーザーの設定を変更する【Tips】管理者権限を持つユーザーで実行する必要有り
usermod -L hogehoge       # hogehogeユーザーをロックする
passwd -S hogehoge        # 確認 => ...(Password locked.)
usermod -U hogehoge       # hogehogeユーザーをアンロックする
passwd -S hogehoge        # 確認 => ...(Password set, SHA512 crypt.)
usermod -G wheel hogehoge # hogehogeユーザーをwheelグループに追加する

# ▽userdel【概要】ユーザーを削除する
userdel hogehoge    # hogehogeユーザーを削除する
userdel -r hogehoge # hogehogeユーザーを削除する。ホームディレクトリも一緒に削除する
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む