- 投稿日:2020-08-23T23:15:55+09:00
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_rsa2.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_rsa2.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_rsa3. おわりに
Windowsにおいても使えるLinuxコマンドが増えてきていることは歓迎なのですが、今回のケースのようにちょっとした違いで躓くこともあるように思います。本記事がどなたかの一助になれば幸いです。
参考
Automate ssh-keygen -t rsa so it does not ask for a passphrase
お前らのSSH Keysの作り方は間違っている
- 投稿日:2020-08-23T22:43:08+09:00
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 ACCEPTLinux では他のホストとの通信だけではなく、プロセス間の通信に 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 アドレスごとにパケットの受信を制限することになります。他にdstipsrcportdstportなどのフラグがあります。複数のフラグの組み合わせも可能です。このオプションを省略した場合は送信元や受信先には関係なく、システム全体としてパケットを受信する頻度を制限することになります。
--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 ACCEPTTCP で 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 ACCEPTTCP の 22 番ポートへの接続を許可します。Ping と同じように hashlimit モジュールを使用して接続の頻度を制限しています。
--dport 22を他のポート番号に変更すれば他の用途にも応用できます。例えば HTTP なら 80 番を、HTTPS なら 443 番ポートの通信を許可してください。ただし、HTTP や HTTPS ではもう少し hashlimit の制限を緩く設定するべきです。DNS クライアント
# DNS サーバーからのレスポンス受信を許可 -A INPUT -p udp --sport 53 -j ACCEPTDNS は 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
- 投稿日:2020-08-23T19:41:53+09:00
【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コマンドです。
ファイルの圧縮、解凍のコマンドを記入してないです。
- 投稿日:2020-08-23T16:29:22+09:00
Linux tar xz のコマンドメモ
tar.gz
圧縮
tar -zcvf xxxx.tar.gz directory
解凍
tar -zxvf xxxx.tar.gztar.bz2
圧縮
tar -jcvf xxxx.tar.bz2 directory
解凍
tar -jxvf xxxx.tar.bz2tar.xz
圧縮
tar -Jcvf xxxx.tar.xz directory
解凍
tar -Jxvf xxxx.tar.xztar
圧縮
tar -cvf xxxx.tar directory
解凍
tar -xvf xxxx.tarzip
圧縮
zip -r xxxx.zip directory
解凍
unzip xxxx.zip
- 投稿日:2020-08-23T13:50:02+09:00
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ユーザーを削除する。ホームディレクトリも一緒に削除する