一。練習#
1、スクリプトを作成し、ユーザーを一括追加します。ユーザー名は user で始まり、具体的な追加ユーザー数はユーザーの入力に従い、各ユーザーにランダムなパスワード(パスワードは 12 桁のランダム文字で構成)を設定し、作成したユーザーとパスワードを記録し、/tmp/user ファイルに保存します。
2、2 つの文字列を結合する方法、2 つの整数を合計する方法、5 を 3 で割り、小数点以下 2 桁を保持する方法。
3、自分のマシンに何人のユーザーがいるか、また何人の一般ユーザーがいるかを計算する方法。
4、文字列からすべての空白を削除する方法。
5、/var/log/nginx/access.log ログをバックアップし、5 分ごとにバックアップを取り、2020-11-15_10_05-access.log.tar.gz という形式で名前を付けます。ログファイルのバックアップを /nginx/ ディレクトリに置きます。
6、/etc/ ディレクトリ内で 10 日以内に 3 日前に変更されたファイルを探し、これらのファイルを /tmp/etc_log ファイルに記録します。
1.1 スクリプトを作成し、ユーザーを一括追加します。ユーザー名は user で始まり、具体的な追加ユーザー数はユーザーの入力に従い、各ユーザーにランダムなパスワード(パスワードは 12 桁のランダム文字で構成)を設定し、作成したユーザーとパスワードを記録し、/tmp/user ファイルに保存します。#
問題 1:スクリプトを作成し、ユーザーを一括追加します。ユーザー名は user で始まり、具体的な追加ユーザー数はユーザーの入力に従い、各ユーザーにランダムなパスワード(パスワードは 12 桁のランダム文字で構成)を設定し、作成したユーザーとパスワードを記録し、/tmp/user ファイルに保存します。
例1
---------------------------------------------------------------------
read -p "追加するユーザーの数を入力してください:" num1
for i in `seq $num1` # 注:ループ回数
do
id user$i &>/dev/null
a=`echo $?` # 注:前のコマンドの戻り値 0 成功 非0 失敗
str1=`date +%s+%N | md5sum|head -c 4` # 注:%sタイムスタンプ
if [ $a -eq 0 ] ;then
echo "そのユーザーは既に存在します。新規作成操作は行いません"
break
else
useradd user$str1$i &>/dev/null
b=`echo $?`
if [ $b -eq 0 ];then
echo "作成成功"
passwd1=`mkpasswd -l 12` # 注:mkpasswd でランダムな12桁のパスワードを生成
echo $passwd1 |passwd user$str1$i --stdin &>/dev/null # 注:--stdin パスワードは標準入力から
echo "user$str1$i:$passwd1" >>/tmp/user
else
echo "作成失敗"
fi
fi
done
---------------------------------------------------------------------
[root@cPen_web lianxi]# date +%s+%N # 注:ナノ秒の概念を引用し、ユーザー名の重複を防ぐ
1605251515+012657467
[root@cPen_web lianxi]# man date
%% リテラル %
%a ロケールの略称の曜日名 (例: Sun) # 注:Sun
%A ロケールの完全な曜日名 (例: Sunday) # 注:Sunday
%s 1970-01-01 00:00:00 UTCからの秒数 # 注:タイムスタンプ 1970年1月1日から現在までの秒数
%N ナノ秒 (000000000..999999999) # 注:ナノ秒 1ナノ秒=十億分の一秒
[root@cPen_web ~]# date +%s+N | md5sum|head -c 4
2b13[root@cPen_web ~]#
例2
---------------------------------------------------------------------
read -p "追加するユーザー数を入力してください:" num
for i in `seq $num`
do
useradd user$i &>/dev/null
passwd=`mkpasswd -l 12`
echo $passwd |passwd user$i --stdin &>/dev/null
echo "ユーザー名:user$i" "パスワード:$passwd" &>>/tmp/user
done
1.2 2 つの文字列を結合する方法、2 つの整数を合計する方法、5 を 3 で割り、小数点以下 2 桁を保持する方法。#
問題 2:2 つの文字列を結合する方法、2 つの整数を合計する方法、5 を 3 で割り、小数点以下 2 桁を保持する方法。
数値演算:https://blog.csdn.net/weixin_34408624/article/details/92598137
#注:2 つの文字列を結合する方法
例
---------------------------------------------------------------------
[root@cPen_web ~]# a=abc
[root@cPen_web ~]# b=def
[root@cPen_web ~]# echo $a$b # 注:文字列結合
abcdef
[root@cPen_web ~]# echo abc$a
abcabc
[root@cPen_web ~]# a=3
[root@cPen_web ~]# b=4
[root@cPen_web ~]# echo $(($a+$b))
7
#注:1つの括弧はデフォルトで文字列結合し、数値演算は行わない
[root@cPen_web ~]# a=123 # 注:デフォルトはすべてstr型
[root@cPen_web ~]# a="123"
[root@cPen_web ~]# a='123'
------------------------------------------------------------
[root@cPen_web ~]# a=123
[root@cPen_web ~]# b=4
[root@cPen_web ~]# echo $(( $a > $b ))
1 # 注:正しい場合は1を返す
[root@cPen_web ~]# echo $(( $a < $b ))
0 # 注:間違った場合は0を返す
[root@cPen_web ~]# expr $a + $b # 注:exprコマンドで数値演算
127
[root@cPen_web ~]# echo $(( $a + $b )) # 注:2つの括弧で整数演算を実現
127
[root@cPen_web ~]# echo $[ $a + $b ] # 注:中括弧で整数演算を実現
127
[root@cPen_web ~]# let c=$a+$b # 注:letも整数演算を実現できる
[root@cPen_web ~]# echo $c # 注:letはコピーのみ、直接代入はできない
127
#注:整数演算:4つの方法
[root@cPen_web ~]# expr $a + $b
[root@cPen_web ~]# echo $(( $a + $b ))
[root@cPen_web ~]# echo $[ $a + $b ]
[root@cPen_web ~]# let c=$a+$b # 注:letはコピーのみ、直接代入はできない
数値演算:https://blog.csdn.net/weixin_34408624/article/details/92598137
------------------------------------------------------------------------
#注:小数演算
echo "scale=3;5/3"|bc # 注:3は小数点以下3桁を保持する 5/3
[root@cPen_web ~]# echo "scale=3;5/3"|bc # 注:ホストにbcがインストールされていることを確認
1.666
[root@cPen_web lianxi]# echo $((5/3))
1
[root@cPen_web lianxi]# echo |awk '{printf 5/3}' # 注:awkはデフォルトで5桁の小数を保持
1.66667[root@cPen_web lianxi]#
[root@cPen_web lianxi]# echo |awk '{printf "%.2f",5/3}' # 注:小数点以下2桁を保持
1.67[root@cPen_web lianxi]#
数値演算:https://blog.csdn.net/weixin_34408624/article/details/92598137
1.3 自分のマシンに何人のユーザーがいるか、また何人の一般ユーザーがいるかを計算する方法。#
問題 3:自分のマシンに何人のユーザーがいるか、また何人の一般ユーザーがいるかを計算する方法。
例
---------------------------------------------------------------------
#3、自分のマシンに何人のユーザーがいるか、また何人の一般ユーザーがいるかを計算する方法。
wc -l /etc/passwd # 注:自分のマシンに何人のユーザーがいるか
awk -F":" '$3>=1000{print $1}' /etc/passwd |wc -l # 注:自分のマシンに何人の一般ユーザーがいるか
#注:一般ユーザーuid>1000
1.4 文字列からすべての空白を削除する方法。#
問題 4:文字列からすべての空白を削除する方法。
例
---------------------------------------------------------------------
str="s t r i n g"
echo $str |tr -d " " # 注:-dで指定した文字を削除
1.5 /var/log/nginx/access.log ログをバックアップし、5 分ごとにバックアップを取り、2020-11-15_10_05-access.log.tar.gz という形式で名前を付けます。ログファイルのバックアップを /nginx/ ディレクトリに置きます。#
問題 5:/var/log/nginx/access.log ログをバックアップし、5 分ごとにバックアップを取り、2020-11-15_10_05-access.log.tar.gz という形式で名前を付けます。ログファイルのバックアップを /nginx/ ディレクトリに置きます。
#注:crontab が開いていることを確認
例
---------------------------------------------------------------------
[root@cPen_web ~]# crontab -e # 注:計画タスクのコマンドは絶対パスで書くのが良い
*/5 * * * * tar czf /nginx/$(date +%Y-%m-%d_%H_%M-access.log.tar.gz) /var/log/nginx/access.log
1.6 /etc/ ディレクトリ内で 10 日以内に 3 日前に変更されたファイルを探し、これらのファイルを /tmp/etc_log ファイルに記録します。#
問題 6:/etc/ ディレクトリ内で 10 日以内に 3 日前に変更されたファイルを探し、これらのファイルを /tmp/etc_log ファイルに記録します。
例
---------------------------------------------------------------------
[root@cPen_web ~]# find /etc -type f -mtime -10 -mtime +3 # 注:注意して、ファイルを探している
/etc/dnf/modules.d/python27.module
/etc/selinux/config
/etc/vsftpd/vsftpd.conf
/etc/dconf/db/site
/etc/dconf/db/local
/etc/dconf/db/distro
[root@cPen_web ~]# stat /etc/selinux/config # 注:statでファイルの元の情報を見る
………………
最近アクセス:2020-11-13 10:14:37.388001468 +0800
最近変更:2020-11-05 15:12:05.484883965 +0800
最近改定:2020-11-05 15:12:05.485883965 +0800
[root@cPen_web lianxi]# find /etc -type f -mtime -10 -mtime +3 &>/tmp/etc_log
二。練習#
シェルを使って簡単なじゃんけんゲームを作成してください。列挙値(0 は石、1 はハサミ、2 は布)で、2 人の選手はそれぞれ rob1 と rob2 で、彼らの出す手はシステムが自動的に列挙し、10 ラウンド連続で行い、最後に 10 ラウンドの結果を表示します。
例1:さまざまな状況を判定するif文
---------------------------------------------------------------------
#!/bin/bash
echo "じゃんけんゲームが始まりました!!!"
echo "今日の2人の対戦者はrob1とrob2です"
pingju=0
rob1_win=0
rob2_win=0
for i in `seq 10`
do
a=`echo $[RANDOM%3]`
b=`echo $[RANDOM%3]`
case $a in
0)
c=rob1は石を出しました
;;
1)
c=rob1はハサミを出しました
;;
2)
c=rob1は布を出しました
;;
esac
case $b in
0)
d=rob2は石を出しました
;;
1)
d=rob2はハサミを出しました
;;
2)
d=rob2は布を出しました
;;
esac
if (($a==$b));then
echo -e "$c\n$d \n彼らは引き分けました"
pingju=$[$pingju+1]
continue
fi
if [[ $a -eq 1 || $b -eq 1 ]];then # 注:もし1方が布を出した場合
if [[ $a -eq 0 || $b -eq 0 ]];then # 注:もし1方が石を出した場合
if (($a>$b));then
echo -e "$c\n$d,rob2が勝ちました"
rob2_win=$[$rob2_win+1]
continue
else
echo -e "$c\n$d,rob1が勝ちました"
rob1_win=$[$rob1_win+1]
continue
fi
fi
fi
if (($a>$b));then
echo -e "$c\n$d,rob1が勝ちました"
rob1_win=$[$rob1_win+1]
else
echo -e "$c\n$d,rob2が勝ちました"
rob2_win=$[$rob2_win+1]
fi
done
echo "rob1の勝利回数$rob1_win,rob2の勝利回数$rob2_win,引き分け回数$pingju
============================================================================================
例2:減算を使用
#注:if文の使用
---------------------------------------------------------------------
for i in `seq 10`
do
rob1=$(($RANDOM%3))
echo rob1=$rob1
rob2=$(($RANDOM%3))
echo rob2=$rob2
if [ $rob1 -eq $rob2 ]
then
echo "引き分け"
elif [ $(($rob1-$rob2)) -eq -1 ] || [ $(($rob1-$rob2)) -eq 2 ] # 注:rob1が勝つ場合
then
echo "rob1が勝ちました"
else
echo "rob2が勝ちました"
fi
done
============================================================================================
例3
---------------------------------------------------------------------
r1_win=0
r2_win=0
equal=0
for i in `seq 10`
do
echo -ne "第$iラウンド\t"
rob1_res=$(($RANDOM%3))
rob2_res=$(($RANDOM%3))
if [[ $(($rob1_res - $rob2_res)) = -1 ]]; then echo -ne "rob1勝ち\t" &&r1_win=$(($r1_win + 1)); fi
if [[ $(($rob1_res - $rob2_res)) = 2 ]]; then echo -ne "rob1勝ち\t" &&r1_win=$(($r1_win + 1)); fi
if [[ $(($rob2_res - $rob1_res)) = -1 ]]; then echo -ne "rob2勝ち\t" &&r2_win=$(($r2_win + 1)); fi
if [[ $(($rob2_res - $rob1_res)) = 2 ]]; then echo -ne "rob2勝ち\t" &&r2_win=$(($r2_win + 1)); fi
if [[ $(($rob1_res - $rob2_res)) = 0 ]]; then echo -ne "引き分け\t" && equal=$(($equal + 1)); fi
[[ $rob1_res = 0 ]] && echo -ne "rob1:石\t"
[[ $rob1_res = 1 ]] && echo -ne "rob1:ハサミ\t"
[[ $rob1_res = 2 ]] && echo -ne "rob1:布\t\t"
[[ $rob2_res = 0 ]] && echo "rob2:石"
[[ $rob2_res = 1 ]] && echo "rob2:ハサミ"
[[ $rob2_res = 2 ]] && echo "rob2:布"
done
echo "rob1勝利回数:$r1_win"
echo "rob2勝利回数:$r2_win"
echo "引き分け回数:$equal"
例4:3未満のランダム数を生成
---------------------------------------------------------------------
#注:3未満のランダム数を生成
[root@cPen_web lianxi]# echo $[RANDOM%3]
2
[root@cPen_web lianxi]# echo $[RANDOM%3]
1
[root@cPen_web lianxi]# echo $[RANDOM%3]
0
SSH サービス
三. SSH サービスの紹介#
リモートシェルアプリケーション
- ユーザーがリモートマシン上で任意のコマンドを実行できるようにします
- 標準出力をローカルに表示します
- 早期の平文リモートプロトコル:telnet
SSH(Secure Shell、安全なシェル)
- クライアントに安全なシェル環境を提供し、リモート管理を行います
- デフォルトポート:TCP
22
SSH は公開鍵暗号(非対称暗号)技術に基づいています
- データを暗号化して送信します
- クライアントとサーバーの認証を行います
#注:23 番ポートは平文であり、すでに廃止されています
.--------------------------------------------------------------------------------------------------------------
ssh とは?
ssh --> secure shell
リモートログインプログラム -- リモートログインモード
データを暗号化して送信するサービスで、主にリモートログインに使用されます
#注:データを暗号化されたシェルに入れることで、安全なプロトコルになります
.--------------------------------------------------------------------------------------------------------------
ssh プロトコルはアプリケーション層プロトコルであり、ssh プロトコルに基づいて実装されたサービスを ssh サービスと呼びます
ssh サービスは主に HP-UX、LINUX、AIX、UNIX システム上に存在します(UNIX 系システム上)、Windows にはありません
#注:ftp プロトコルもアプリケーション層のプロトコルであり、プロトコルに基づいて実装されたサービスを ftp サービスと呼びます
.--------------------------------------------------------------------------------------------------------------
ssh の一般的な 2 つのログイン方法:
1、パスワードログイン
2、鍵ログイン(パスワードなしログイン) # 注:パスワードは不要
#注:どのホストにログインするには、1、ホストの IP を知っている必要があります、2、ログインを許可されている必要があります、3、ネットワークが接続されている必要があります。
#注:ssh サービスのデフォルトポートは 22 番ポートです。変更することもできます。
.--------------------------------------------------------------------------------------------------------------
#注:/etc/services
で一般的なサービスのデフォルトポート番号を確認できます
[root@cPen_web lianxi]# less /etc/services
ssh 22/tcp # The Secure Shell (SSH) Protocol
ssh 22/udp # The Secure Shell (SSH) Protocol
#注:一般的にsshはtcpを使用して送信されます
.--------------------------------------------------------------------------------------------------------------
#注:すべてのデータが暗号化されているため、安全なシェルです。
#注:2 台のホスト間でデータをやり取りする際には、データパケットの送信が関与します。
#注:他のサービスにリクエストを送信することは、実際にはそのサービスにパケットを送信することを意味します。このパケットにはリクエストが含まれています。
#注:通常、暗号化しない場合、情報は平文であり、安全ではありません。ssh サービスはデータを暗号化し、a ホストと b ホストだけが解読方法を知っており、他の人は知りません。
#注:システムをインストールした後(最小インストール)、通常は ssh サービスが自動的に起動します。
.--------------------------------------------------------------------------------------------------------------
例:sshサービスが起動しているか確認する
---------------------------------------------------------------------------------
1、プロセスを確認
[root@cPen_web lianxi]# ps ef |grep ssh # 注:プロセス名はsshdです
2、pidof sshd # 注:特定のサービスがpidを持っているか確認
[root@cPen_web lianxi]# pidof sshd # 注:サービスが起動している場合、必ず1つのpidがあります
2545 2543 2542 2538 2537 2536 909
#サービスが起動している場合、必ず1つのpidがあります
3、ネットワーク接続のリスニング状態を確認 netstat
#注:yum install net-tools
[root@cPen_web lianxi]# netstat -atpl |grep ssh # 注:a すべて ;t tcp ;p ポート
[root@cPen_web lianxi]# netstat -atpln |grep ssh
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 909/sshd
#注:listen状態はリスニング中であり、他の人が接続できることを示します
tcp 0 0 192.168.0.21:22 192.168.0.42:58697 ESTABLISHED 2536/sshd: root [pr
#注:ESTABLISHEDは接続が確立され、データ交換が可能であることを示します;
tcp 0 36 192.168.0.21:22 192.168.0.42:58698 ESTABLISHED 2537/sshd: root [pr
tcp6 0 0 :::22 :::* LISTEN 909/sshd
#注:0.0.0.0:22はすべてのIPで22番ポートをリスニングしていることを示します(他の人はすべてのIPを通じてアクセスできます)。もしこれを192.168.0.135/24にリスニングさせると、他の人は135のアドレスを通じてのみアクセスできるようになります。
#注:listen状態はリスニング中であり、サービスが起動していることを示します。
#注:establishはクライアントが接続したことを示します(接続が確立された状態)。
#注:0.0.0.0:*は任意のIP、任意のポートのクライアントが接続できることを示します (*は任意のポートのクライアントを示します)。
#注:0.0.0.0:22の最初の形式はローカルのすべてのIPを示します (ローカルのものです)。
#注:0.0.0.0:*は任意のIP、任意のポートのクライアントが接続できることを示します (外部クライアントの任意のポート)(*は任意のポートのクライアントを示します)。
------------------------------------------------------------------------------------------------------
#注:ローカルループバックアドレスはローカルを示し、ネットワークカードが正常かどうかをテストします 127.0.0.1/8 ローカルループバックアドレス
#注:ネットワークカードの実際のアドレス 192.168.0.21/24
#注:他の人は127.0.0.1を通じてアクセスできません。なぜなら127.0.0.1はローカルを示し、すべてのマシンには127.0.0.1のローカルループバックアドレスがあります。他の人が127.0.0.1を通じてアクセスするのは、単に自分自身にアクセスすることです。
4、lsof -i:22 #注:listen状態のリスニングがあるか確認; establishは接続が確立されたことを示します
#注:ポートを知った後、ポートを確認できます
#注:lsof --> list open file オープンファイルをリストアップ(全称)
[root@cPen_web ~]# lsof -i:22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 908 root 4u IPv4 27707 0t0 TCP *:ssh (LISTEN) # 注:listen リスニング状態
sshd 908 root 6u IPv6 27721 0t0 TCP *:ssh (LISTEN) # 注:ESTABLISHED 接続が確立された
sshd 1419 root 5u IPv4 29943 0t0 TCP cPen_web:ssh->10.112.68.22:49959 (ESTABLISHED)
sshd 1421 root 5u IPv4 29943 0t0 TCP cPen_web:ssh->10.112.68.22:49959 (ESTABLISHED)
============================================================================================
例:IPアドレスを追加
[root@cPen_web lianxi]# ip a add 192.168.0.144/24 # 注:IPアドレスを追加
[root@cPen_web lianxi]# ip add # 注:同じネットワークセグメントにするのが良い
inet 127.0.0.1/8 scope host lo # 注:dev ens3 デバイス ens33
inet 192.168.0.21/24 brd 192.168.0.255 scope global dynamic noprefixroute ens33
inet 192.168.0.144/24 scope global secondary ens33
============================================================================================
例:コマンドがどのパッケージに属するか確認
[root@cPen_web lianxi]# which netstat # 注:コマンドの絶対パスを見つける
/usr/bin/netstat
[root@cPen_web lianxi]# rpm -qf /usr/bin/netstat # 注:この絶対パスの実行ファイルがどのパッケージに属するか確認
net-tools-2.0-0.51.20160912git.el8.x86_64
四。鍵ログイン#
[root@cPen_web ~]# ssh-keygen # 注:鍵ペアを作成
Generating public/private rsa key pair. # 注:rsaアルゴリズムで公開鍵と秘密鍵のペアを生成(鍵は2つあり、同じものではありません)
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:JZh0IhlTUDkIvuXuv7Iw7zYsoucwfLjpPWrHYN7P63g root@cPen_web
The key's randomart image is:
+---[RSA 2048]----+
| ..=B=.. |
| . o+o= |
| . . o.. . |
| + o |
| . . S |
|.o.. |
|=o*o. |
|.=BXBE |
|=O+*XX+. |
+----[SHA256]-----+
[root@cPen_web ~]#
暗号化
-
対称暗号化
暗号化と復号化の鍵は同じです。
このパスワードを安全に保存する方法は、暗号化するマシン間で共有されます。
この鍵が漏れないことを保証するのは難しいです。
-
非対称暗号化 # 注:暗号化と復号化の鍵は異なります。
公開鍵と秘密鍵のペアを生成し、秘密鍵は自分で保管し、公開鍵は他の人に渡すことができます。
公開鍵と秘密鍵はペアで存在し、一方は暗号化に使用され、もう一方は復号化に使用されます。どちらが秘密鍵で、どちらが公開鍵かは使用者が管理します。
注意:
公開鍵で暗号化し、秘密鍵で復号化するのが基本的にデータ暗号化に使用されます。
秘密鍵で暗号化し、公開鍵で復号化するのが認証に使用されます。
[root@cPen_web ~]# ssh-keygen # 注:鍵ペアを作成
Generating public/private rsa key pair. # 注:rsaアルゴリズムで公開鍵と秘密鍵のペアを生成(鍵は2つあり、同じものではありません)
Enter file in which to save the key (/root/.ssh/id_rsa): # 注:公開鍵と秘密鍵の保存パス、rootユーザーの
Enter passphrase (empty for no passphrase): # 注:鍵のパスワードを設定 # 注:非全局
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:JZh0IhlTUDkIvuXuv7Iw7zYsoucwfLjpPWrHYN7P63g root@cPen_web # 注:アルゴリズムhashアルゴリズム
The key's randomart image is: # 注:情報摘要に使用されるSHA256 hashアルゴリズム
+---[RSA 2048]----+
| ..=B=.. |
| . o+o= |
| . . o.. . |
| + o |
| . . S |
|.o.. |
|=o*o. |
|.=BXBE |
|=O+*XX+. |
+----[SHA256]-----+
[root@cPen_web ~]#
#注:hashアルゴリズムは任意の長さの入力を固定長の出力にマッピングします
--------------------------------------------------------------------------------------------
#注:暗号化は2つの方法に分けられます:1、対称暗号化;2、非対称暗号化
#注:対称暗号化では、aマシンがbマシンに物を送信する際、aマシンはaaというパスワードを知っており、bマシンもこのパスワードを知っています。aマシンはdateをaaで暗号化し、bマシンはaaで復号化します。2つの暗号化と復号化は同じ鍵を使用します(暗号化の鍵AとBは両方とも知っています)。形式的な条件はaとbが鍵を知っていることです。
#注:問題は、鍵が他の人に知られないことを保証できないことです。
#注:非対称暗号化では、aマシンとbマシンがデータを暗号化して送信します(通信を行います)。aマシンはローカルで公開鍵と秘密鍵のペアを生成し、aマシンは公開鍵と秘密鍵をaマシンに保存します。データを送信する際、aマシンはbに公開鍵を渡します(cにも渡すことができます。公開鍵は誰にでも渡せますが、秘密鍵は自分だけが知っています)。bマシンはaマシンから渡された公開鍵で暗号化し、aマシンは受信後に秘密鍵で復号化します。
唯一の解読可能な鍵は秘密鍵であり、aマシンだけが持っているため、aマシンだけが復号化できます。
#注:データ情報の暗号化に関しては、公開鍵で暗号化し、秘密鍵で復号化します。aマシンだけが復号化できます。
#注:非対称暗号化はデータ暗号化の際に公開鍵で暗号化し、秘密鍵で復号化します。
五. ssh 設定#
ssh 設定
ディレクトリ:/etc/ssh # 注:この下にはすべて ssh の設定ファイルが置かれています
[root@cPen_web ~]# cd /etc/ssh/
[root@cPen_web ssh]# ls
moduli sshd_config ssh_host_ecdsa_key.pub ssh_host_ed25519_key.pub ssh_host_rsa_key.pub
ssh_config ssh_host_ecdsa_key ssh_host_ed25519_key ssh_host_rsa_key
#注:sshd_configはクライアントの設定ファイルです
#注:ssh_configはサービスの設定ファイルです
#注:ssh_host_ecdsa_keyとssh_host_ecdsa_key.pubは一対の公開鍵と秘密鍵です
#注:sshサービスが起動すると、自動的に1対の公開鍵と秘密鍵が作成されます
例:作成された公開鍵と秘密鍵はデフォルトで/root/.ssh/ディレクトリに置かれます
[root@cPen_web ~]# cd .ssh
[root@cPen_web .ssh]# ls
id_rsa id_rsa.pub known_hosts
#注:id_rsaは秘密鍵
#注:id_rsa.pubは公開鍵
六。公開鍵認証(パスワードなしログイン)の実現#
#注:aマシンで(公開鍵を生成した後)
[root@cPen_web ~]# cd .ssh
[root@cPen_web .ssh]# ls
id_rsa id_rsa.pub known_hosts
[root@cPen_web .ssh]# cat id_rsa.pub
ssh-rsa
AAAAB3NhQX......jXDv87iERv/z9XepKCeYqCfF2Dvv0n/g+IeFmzhW0iOppExskimMPGGWcN+7rXWlwaLNTiknmSTl+mFvZV8uIY5DnQXv root@cPen_web
#注:bマシンで
[root@cPen_web ~]# mkdir .ssh # 注:存在しない場合は.sshフォルダを作成
[root@cPen_web ~]# cd .ssh/
[root@cPen_web .ssh]# ls
known_hosts
[root@cPen_web .ssh]# vim authorized_keys # 注:authorized_keysファイルを作成
ssh-rsa # 注:aマシンの公開鍵を貼り付ける
AAAAB3NhQX......jXDv87iERv/z9XepKCeYqCfF2Dvv0n/g+IeFmzhW0iOppExskimMPGGWcN+7rXWlwaLNTiknmSTl+mFvZV8uIY5DnQXv root@cPen_web
[root@cPen_web .ssh]# chmod 600 authorized_keys
#注:その権限を600に設定し、他の人や他のグループに権限を与えない
#注:aマシンで
[root@cPen_web .ssh]# ssh root@10.122.148.108 # 注:クライアントを使用してrootユーザーでログイン
………………………
接続を続けますか(yes/no)? yes
………………………
[root@cPen_web ~]# # 注:パスワードを入力する必要がなく、パスワードなしでログイン成功
公開鍵認証を実現し、パスワードなしログインを実現します。
A --> B A マシンが B マシンにログインする必要があります。
1、A マシンで公開鍵ペアを生成します(公開鍵ペアがある場合は再生成する必要はありません)。デフォルトでは、現在のユーザーのホームディレクトリの.ssh/ フォルダに置かれます。
生成された id_rsa(秘密鍵)と id_rsa.pub(公開鍵)。
#注:すでにある場合は、公開鍵ペアを再生成する必要はありません。なぜなら、上書きされるからです。デフォルトのパスを変更する意味はあまりありません。なぜなら、デフォルトのパスで探すからです。
[root@cPen_web ~]# ssh-keygen # 注:生成し、途中で Enter を押してデフォルトを選択
2、B マシンのターゲットユーザーのホームディレクトリの~/.ssh/authorized_keys ファイルに A マシンの公開鍵をコピー&ペーストします。
このファイルが存在しない場合は作成し、このファイルの権限を 600 に設定します。
3、公開鍵認証が成功したか確認します。
A マシンで ssh root@B マシンの IP を実行します。
パスワードを入力せずに B マシンにログインできれば、パスワードなしログインが成功したことを示します。
公開鍵が B マシンのどのユーザーの下に置かれているかによって、そのユーザーでログインします。
どのユーザーでログインするかは、公開鍵が B マシンのどのユーザーの下に置かれているかによります。
[root@cPen_web ~]# useradd wy
[root@cPen_web ~]# su - wy # 注:su切り替えはsshサービスを経由しません
[wy@cPen_web ~]#
#注:suでユーザーを切り替えると、sshを経由しません。
#注:sshはリモートログインです。
su と su - su切り替えはbash環境を切り替えません(元のユーザーのbash環境のままです)。
su -は切り替え、wyのbash環境に切り替えます。
公開鍵認証のトラブルシューティング
-
公開鍵が正しいことを確認します。
-
~/.ssh/authorized_keys ファイルの権限が 600 であることを確認します。
-
ホームディレクトリと.ssh ディレクトリの権限が 755 以下であることを確認します。つまり、グループと他の人には 7 の権限がありません。