カテゴリ:13.実際にやってみる > 13.3.1 Linux(基本)

■Linux基本操作
・pwdで今の場所を確認
・ls ファイルのリストを確認
・↑↓の矢印キーを使って、前のコマンドを再表示できる
・Tabキーで補完

◆2.文字列を探す。→ grep
findによるファイル名を探すのとはまた別
①文字を探す(基本)
192.168.1.10という文字列を/etcディレクトリの中から探す場合。

grep "192.168.1.10" /etc/*

②オプション
・サブディレクトリ以下も探す場合は -rオプション(recersive再帰的?)
# grep -r "@seeeko.com" /*

・除外して表示 -vオプション
たとえば、以下をすれば、実際にログインできるユーザがある程度分かる
cat /etc/passwd | grep -v "nologin"

・-i 大文字小文字の区別をしない
# grep "wao" -i -r /var/www
/var/www/html/index.html:waooooo
/var/www/html/a.php:echo 'Hello Wao';

◆コピー
cp -pでアクセス権などを保持したままコピーする。pはpermanentだと思う。このオプションをつけないと、もともとのアクセス権とコピー先のアクセス権の積が新しいアクセス権である。
cp -r (recursive) ディレクトリごとコピーする。ちなみにmvには-rオプションは存在しない。
 (例) cp -r dirA dirB dirAをdirBという名でコピー

こんなコピーの仕方もできる。それほど楽になるわけではないが
cp named.conf{,.org}

◆移動
mvを使う
ディレクトリでも使える。cpと違って-rオプションは不要
-f 移動先にファイルがあっても上書きする場合は-fオプションをつける。
-i 上書きする場合に警告を出す。

・フォルダの異動
配下にファイルがあることを気にせず、以下でよい。
#mv dir1 dir2

◆削除
rm -f 強制削除 (消しますか?と聞かれない)
rm -rf とすると、フォルダ配下のファイルごと消す

◆LinuxでもRDPを使う。
Linuxの場合は、rdesktop(http://www.rdesktop.org/)というプログラムを使えば、制限はあるものの、Windows XP Professionalのリモートデスクトップ機能にアクセスできる。
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/431usexprd.html

◆ファイル比較
diff /etc/a.txt  /etc/b.txt とすることで、a.txtとb.txtの2つのファイルを比較することができる。

①一致しているか違うか
diff -q a.txt b.txt
→differと出れば、違う

②どこが違うかもわかる
#diff -q a.txt b.txt
1,2c1,2  

※cはCompare(比較)という意味。左側の1,2が1行目と2行目、cの右側が1行目と2行目。つまり、1行目と2行目が違うと言っている。

◆locate
ファイルの場所を検索できる。(結構使える)
findに比べて、DBを作成するので
apt install locate
updatedb
locate ファイル名(部分的でOK)

◆ファイル(ディレクトリ)の検索 find
①標準の使い方
・基本構文は以下
 find [ 場所 ] -name [ ファイル名 ]  ※ファイル名は' ' で囲っていいと思う。
・例えば、カレントディレクトリから pgsqlというファイルやディレクトリを探す。
find -name pgsql
※全ファイルを検索したいのであれば、cdでルート(/)に移動する、またはファイルの場所として / を指定する。
・ファイル名には*も使える。
find / -name pgs*
・ファイルに限定したい場合は、末尾に -type f ディレクトリに限定するには -type d
find / -name pgs* -type f

②修正された時間や日から検索する。
たとえば、1日以内に修正されたファイルを検索するのであれば
find / -mtime 1
https://qiita.com/narumi_/items/9ea27362a1eb502e2dbc

■ファイルの取得 curl
(1)curlの基本
wgetでも同様にファイルを取得できる。しかし、wgetはHTTPとHTTPS、FTPのみだが、それに比べてSCPなど、対応するプロトコルが多い。
①オプションを付けないと
HTTTPレスポンスのメッセージボディのみを表示
curl http://www.exapmle.com

②-iオプションで
全てのレスポンス

③ファイルをダウンロードする場合は-Oオプションを付ける
普通にそのままcurlコマンドを実行すると、画面に表示する仕様なので、-Oオプション(大文字のO)をつけて、ファイルとして取得する。

※windows curl -o (小文字)で、パスとファイル名を指定できるはず。
curl.exe -o C:\file.txt URL
※wgetの場合は、-Oなどのオプションを付けずに、そのままファイルのURLを指定すればいよい。

(2)curlのメソッドによる操作の違い
まあ、PUTやDELETEメソッドはHTTPサーバ側で拒否されていると思うが、参考までに以下。
以下はWebDavが許可されている場合。
①アップロード (上書きも可能)
curl -T a.txt --url http://10.1.1.115/dav/a.txt -X PUT
②ファイル取得
curl -O http://10.1.1.115/dav/a.txt
以下だと、ファイルを取得せずに中身を表示
curl --url http://10.1.1.115/dav/a.txt -X GET
③ファイルDELETE(削除)
curl --url http://10.1.1.115/dav/a.txt -X DELETE

■言語の状態を確認する
/etc/sysconfig/i18n

LANG= で設定されている言語がわかる

ズや利用率などがわかる。kはキロバイト表示の意味。dfはファイルシステム単位での表示で、duはファイルやディレクトリ単位での表示。
du -s sはsummuryで、合計値を出す。ユーザのホームディレクトリの使用量合計を見る場合などに便利である。
df -hとすると、単位が見やすくなる。
hはhumanのhだと思う。人間が見やすい状態になる。
たとえば 40313964→40G

■ルーティング
・netstat -r ルーティングに関する情報を表示
・スタティックルートの追加
route add -net 10.1.1.0 netmask 255.255.255.0 gw 192.168.1.254 (eth0)
※最後のインターフェース(eth0など)は省略可能。

表示
-a すべての接続を表示
-l Listeningの接続を表示
-s Summery(統計)が表示される。ICMPなどのプロトコルごとに集約される。

◆基礎情報
init=initialize(初期化)
rc.dなどのように、dがついているものは、ディレクトリであることを明示的に示している。

rc=run command

inittab=(initialize table)
/etc/inittabにおいて、デフォルトのランレベルを設定する。

◆起動スクリプトと実行ファイル
(1)起動スクリプト
/etc/rc.d/init.d/sshd
たとえば,start コマンドがわたされた場合にはどうるするか
が記載されている

(2)実行ファイル
/usr/sbin/sshd
バイナリファイルとして存在する.

◆コマンドライン
| パイプ コマンドを続けて実行
> リダイレクト 結果をファイルへ出力。既存のファイルがある場合は、完全に上書きされる。
>> 結果をファイルに追記
; コマンドを続けて実行
& バックグラウンドで実行
&& コマンドの結果がYesなら次のコマンドを実行 逆が ||

■リダイレクト
エラーも含めて表示するには
 rmdir dir1 >& file3
https://webkaru.net/linux/redirect-output-to-file/

■LinuxにおけるPrintScreen
X window dumpという。コマンドは、頭文字をとってxwd

 xwd -frame out ファイル名 
 
frameオプションは、フレームも含めてキャプチャする。

■cron
crontabであるが、最近は使わないかもしれない。
0,7は日曜日 1が月

-e 編集(edit)
-r remove
-l list

★注意点は、AWSの場合は、crondではなく、cron
systemctl status cronをみると、動いていることがわかる。

また、書き方にはいろいろあるが、以下が参考になった。/etc/cron.d/にファイルをおきましょう。
http://thoames.hatenadiary.jp/entry/2018/12/30/101021
/etc/cron.d/にファイルを作る。そうすると、実行される
/etc/cron.d/cert_month
0 0 1 * *       root    /etc/lego/abc.sh
※うまく動くか、さてどうだろうか。

■tcpdump
コマンドラインだとWiresharkをインストールしにくい。GUIじゃなにから、見るのも困難。
だが、Linuxにはパケットキャプチャのコマンドがすでに入っている。それがtcpdump

送信元が192.168.1.10の80ポートへの通信をキャプチャする。
#tcpdump src host 192.168.1.10 and port 80

80番ポートへのパケットをキャプチャする ※例として、Webサーバへのパケットをキャプチャ
# tcpdump -i eth0 dst port 80 -vvv
※vvvは、詳細の意味。パケットのヘッダなどもキャプチャしてくれる。

tcpdump -i ens33 src 100.64.1.75
-iはインターフェース
srcは送信元IPアドレス
https://webkaru.net/linux/tcpdump-command/

■コンパイルしてインストール
たしかmake make installなどの手順を踏む。
・./configure
引数を渡すことで、インストール時の設定を変えることができる。
たとえば、--prefix= によって、インストール先のディレクトリを変えることができます。

◆画面切り替え
Ctrl + Alt + F1~F7によって、コンソール画面を切り替えることが可能になる。これによりXwindowのようなマルチウィンドウ操作が可能である。

■ブラウザの起動
firefox & でブラウザを起動
&をつけておくと、ターミナルで操作を続けることができる

■パス
コマンドが通らない場合
whichで探すといい
# which iptables
/sbin/httpd

・今のパスを表示
# echo $PATH 
・追加する場合は、
# export PATH=$PATH:/usr/xxxx

■CentOSのバージョン確認方法
cat /etc/redhat-release
※uname -rだと、よくわからない。

■ログ
認証エラーは以下に保存される。認証に失敗したら、見るといいだろう
 /var/log/secure
SSHなどの接続ログもここにに記録される。失敗も成功も、ログオフした時間も。
・成功の場合
Jul 13 05:01:54 ip-172-31-41-230 sshd[3221]: Accepted publickey for ec2-user from 203.0.113.184 port 50933 ssh2: RSA SHA256:I8Bm***S3TG7I
・パスワード認証の失敗
Jul 19 10:12:49 ip-172-31-41-230 sshd[12229]: Failed password for user1 from 203.0.113.184 port 61101 ssh2

うまく記録されないときは、サービスがおかしいのかもしれない。
以下をお試しあれ(ネット情報のコピペなので、内容は不明)

rm /var/lib/rsyslog/imjournal.state
systemctl restart rsyslog.service

また、ポートスキャンのログは、特定のファイルには残らないようだ。設定で、何でも取得するというような変更が必要だと思う。

(3)ログの設定
以下から
vi /etc/logrotate.conf
たとえば、以下のようにログの保存期間というかローテーション数が記載されている。
# rotate log files weekly
weekly  ←ローテーションの周期
# keep 4 weeks worth of backlogs
rotate 4 ←どれだけ保存するか

なので、4週分で削除されてしまう。1年間保管したいのであれば、48にする。


■wc
・word count
wc ファイルの単語数を表示できる。
wc -l 行数を表示する

■headとtail
先頭および末尾から指定された行数だけ表示する。
tail はよく使うと思う。
たとえば、以下はfile.txt の先頭の10行を表示する
head -10 file.txt

■vmstat
CPUやメモリの使用状況を見る
#vmstat 1 ←1秒間隔で再表示

■syslogサーバに転送
AWSでSyslogサーバを構築してみる。AWSのセキュリティグループで、TCPとUDPの514番ポートを開けておく
#rsyslogのインストール。awsはすでに入っているが、入っていなければ以下を実行
yum -y install rsyslog

#バージョンの確認
rsyslogd -v
rsyslogd 8.24.0-57.amzn2.1, compiled with:
        PLATFORM:                               x86_64-koji-linux-gnu
        PLATFORM (lsb_release -d):
        FEATURE_REGEXP:                         Yes


#/etc/rsyslog.confを編集し、ログを受け付け

#Confファイルのバックアップを取っておこう
cd /etc
cp rsyslog.conf rsyslog.conf.org

#以下の15行目と16行目のコメントアウトを外す
 14 # Provides UDP syslog reception
 15 $ModLoad imudp
 16 $UDPServerRun 514

#再起動
systemctl restart rsyslog
 
#ログの保存場所は、/var/log/messages
#送られて来ているかは、以下で見るといいだろう。
tcpdump port 514

【参考までに、CiscoルータでSyslogサーバを指定する方法】

### IFにIPアドレスの設定
conf t
int gigabitEthernet 0
ip address 192.168.1.120 255.255.255.0
no shutdown
exit

### デフォルトルートの設定
ip route 0.0.0.0 0.0.0.0 192.168.1.1

### Syslogサーバの指定
logging host 203.0.113.125
end

### 疎通確認(インターネットへ接続できるか
ping 8.8.8.8

■CentOSでWireshark
CentOSにWiresharkをインストールする
もちろん、GUIで利用する。CLIじゃわからいよね→tcpdumpの方がいいだろう。
①インストール
# yum install wireshark-gnome
②起動
# wireshark &
・GHEXをインストール →うまくいかなかった。Ubuntu向けのアプリのようだ。
①インストール
#yum -y install ghex

■LinuxにThunderbirdを入れる
#yum install thunderbird
GUI画面のアプリケーション>インターネット に登場する

■ファイルの圧縮、解凍
フォルダの圧縮・解凍には、gzipとgunzip,tarがある

①zipファイル
zip filename で圧縮、unzip filename で解凍できる。では、順にやってみよう。
・3つのファイルをZIPで一つのファイルに圧縮する
# zip total.zip file1.txt file2.txt file3.txt
  adding: file1.txt (stored 0%)
  adding: file2.txt (stored 0%)
  adding: file3.txt (stored 0%)

・以下で解凍。
# unzip total.zip
Archive:  total.zip
 extracting: file1.txt
 extracting: file2.txt
 extracting: file3.txt

・また、-lをつけると、解凍せずに中身だけみることができる。
# unzip -l total.zip
Archive:  total.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        3  02-12-2020 1:43   file1.txt
        4  02-12-2020 1:43   file2.txt
        5  02-12-2020 1:43   file3.txt
---------                     -------
       12                     3 files

tarで圧縮するとWindowsでは取得できないので、zipがいい。-rはフォルダごとのバックアップ

#zip html -r ./html

②gunzip
#gunzip filename.gz
ただし、フォルダに関しては、gzipが使えないのでtarを使う

よくわからないが、以下の場合は
https://github.com/ctfs/write-ups-2014/tree/master/seccon-ctf-2014/get-the-key-txt
#gunzip < 1

#guzip -c 1  こちらでも成功。
本当は、オプション無しでも解凍できるはずだが、失敗

※TeraTermのSCPではフォルダは転送できないので、圧縮しよう

②gzファイル
gzファイルの解凍
gunzip ファイル名.tar.gz

# ls
ctf2021.tar.gz
# gunzip ctf2021.tar.gz
# ls
ctf2021.tar
# tar -xvf ctf2021.tar

※gzファイルから一気に解凍するには以下かも
tar -zxvf ctf2021.tar.gz

③tar
#tar czf html.tar.gz /var/www/html
※ただし、絶対パスは推奨されていないので、以下のようなエラーがでる。でも、いちおう、圧縮してくれる
tar: Removing leading `/' from member names

ただ、tarで圧縮するとWindowsでは取得できないので、zipがいい。

■パケットを作る
hpingを使う
https://qiita.com/hana_shin/items/8147777ff42e7dad89d6

■その他
・画面をクリアする →clearコマンド
・コマンドを複数並べる → &&
yum -y update && reboot


■コマンドラインでif文
①以下は、数字が一致しているかどうかとう単純なもの
if [ 2 -eq 1 ]; then echo true; else echo false; fi
②以下はファイルを取得してきて、grep -q の後に記載した文字列がindex.htmlに含まれているかどうかで処理を変える。
curl -O http://x.x.x/index.html
if grep -q moji index.html ;then echo "OK">result.html;else echo "NG">result.html;fi

forも使える
https://qiita.com/w_atame/items/6232465079d924eae805

(1)サービス関連
・サービスの起動
# systemctl start httpd

※ただ、うまくいっても何も反応してくれない。
なので、statusを確認する必要がある。

・サービスの状態確認
#systemctl status httpd

動いていると、active(running)と表示される。

・サービスの停止
# systemctl stop httpd

・再起動
# systemctl restart httpd

・自動起動の設定
# systemctl enable httpd   ←on
# systemctl disable httpd   ←off
※古いコマンドも一応、使える。ただし、上記のコマンドにリダイレクトされたよ!とメッセージが出る
# chkconfig httpd on

・自動起動が設定しているかの確認にはis-enabledを使う
#systemctl is-enabled named
disabled
↑はEnableになっていない

・自動起動の一覧表示
# systemctl list-unit-files -t service

ただ、たくさんでてくるので、httpdだけを見たいなら、パイプで  | grep httpd としましょう。
古いコマンドの chkconfig --listだと、全部が見えないので、実質、使えない。

■システムの停止 shutdownコマンド
・以下を実行したら、ユーザがログイン中とでた。'systemctl poweroff -i'を使えとある。
#shutdown -h now
User xxx is logged in ~
Please retry operation after closing inhibitors and logging out other users.
Alternatively, ignore inhibitors and users with 'systemctl poweroff -i'.

・-iオプションをhelpで見た
#systemctl poweroff -h

すると、以下のようにinhibitors(阻害物)を無視(ignore)するとある
-i --ignore-inhibitors  When shutting down or sleeping, ignore inhibitors

■1.パーミッションとchmod、umask
(1)パーミッション
例で考えましょう
 drwxr-xr-x

最初がディレクトリを表すd
次の3つは所有者のパーミッション
次の3つはグループのパーミッション
最後の3つはOther(その他)のパーミッション

(2)ファイルとディレクトリで、それぞれ何ができる?
①ファイルの場合
 r →Webサイトのテキストや画像などは読むことができる
 rw →掲示板等で書込み可能
 r-x →シェルなどを実行可能
②ディレクトリの場合
 ディレクトリの場合、基本はx(実行権限)が必要と考えた方がいいだろう。実行といっても、ファイルを開いたりすることと考える。
 r →フォルダの中のリスト表示が可能
 w →ファイルを作成したりであるが、x権限も必要だろう。
 x →フォルダを開いたり、ファイルを作成したり

(3)chmod
・-R オプション recursive(再帰的)の意味で、ディレクトリ配下のファイルやディレクトリもすべてパーミッションを変更する。

一般ユーザに読み書き実行権限を付与
chmod 757 /var/www/html/user  
==> otherのユーザにw権限を与えるという意味で、chmod o+w /var/www/html/user でもいい。 

★注意点
ファイルへのアクセス権の付与時には、フォルダへの実行権限が必要
「※ ファイルへのアクセス権限にreadの許可があっても、ディレクトリのexecute許可がなければファイルにアクセスできません。」
 https://www.infraeye.com/study/linuxz26.html

(4)umask 
・パーミッションの設定はchmodで行う。umaskは、新規にファイルやフォルダを作成した場合のパーミッションを設定するもの
たとえば、002(Linuxのデフォルト)の場合
 ①ファイルの場合 666-002=644 → rw-rw-r--
 ②ディレクトリの場合 777-002=775 → drwxrwxr-xになる。
※umaskという引き算方式にせず、普通に644とかにすればいいと思うが、一つで両方を設定できるのが利点なのかも。
・umask と入力すると、デフォルトのumask値が表示される。

(5)chownとアクセス権
フォルダの所有権と所有者(ユーザ)をどちらもapache(グループ)、apache(ユーザ)に変える場合は以下
#chown apache.apache /var/www/html
※「.」ではなく「:」が最近は多いかも
※-Rをつけると、そのフォルダ配下のファイルのアクセス権も変える。

■2.SELinuxを無効にする
(1)確認
/etc/sysconfig/selinuxファイルの「SELINUX=…」となっている行をみる。「SELinux=disabled」となっていれば無効。

または、以下のコマンド
$ getenforce
Enforcing ←有効になっている

(2)変更
変更するには、/etc/selinux/config  ※/etc/sysconfig/selinuxファイルはシンボリックリンク

disabled (無効)
permissive(有効ではないが、警告が出る)

再起動して有効になる。一時的なものであれば、setenforce Permissiveとコマンドを打てばいい

※/etc/sysconfig/selinux のファイルは/etc/selinux/config のリンク。なので、まあ、気持ちの問題だけかもしれないが、/etc/selinux/configを編集した方がいいだろう。オリジナルファイルを保存する場合もこちらを。

◆TCP Wrapper
/etc/hosts.allowと/etc/hosts.denyファイルでアクセス制御をする。
/etc/hosts.allowが優先で、/etc/hosts.allowにサービスに対して許可するIPアドレス(セグメント)やホスト(FQDN)を指定し、/etc/hosts.denyには全拒否の設定を入れる(ALL:ALL)。
たとえば、hosts.allowに192.168.1.0/24からのSSH接続を許可する場合は以下。
sshd: 192.168.1.
ただし、/etc/hosts.denyに以下の設定をいれて拒否をしておかないと、上記の192.168.1.0/24以外からも許可されてしまう。
ALL: ALL

■suidとsgid
suidがセットされると、一般ユーザが実行してもrootが実行したことになる。

/etc/passwdファイルはrootにしか実行件が無い。しかし、一般ユーザでもパスワードを変更できる。これは、/usr/bin/passwdにsuidが設定されているから。※/etc/passwdは設定ファイルで、/usr/bin/passwdは実行ファイル。
chmod u+s ファイル名 ※u+sのところを4755のように頭を4にしても同じ。
このように、+sをつけることで、suidを設定できる。

◆iptablesやfirewalldは別途記載

■1.GUIでの設定
lokkitで簡単に設定できので愛用していたが、CentOS6ではコマンドが異なる
$system-config-firewall

が、centos7では入っていない ⇒firewall-configになった

※人によっては、centos7に入っているfirewalldは使えない、使えるけどイマイチという声もちらほら。結局、iptablesを操作する人もまだまだいる。

■2.iptables
CentOS7からは、iptablesではなくfirewalldに移行。とはいえ、管理IFとしてのfirewalldで裏ではiptables。
だから、iptables で設定してもいいだろう

・設定を確認
# iptables -nL
※n(number)はポート番号で表示。例、22 nが無いとsshと表示

# iptables -nL --line-numbers
こうすると、FWのルールの番号も付与される。ルール番号は大事なので。

■3.firewalld
(1)zone
publicやexternal、dmzなど9つのZoneが存在する。

以下のコマンドで、デフォルトのゾーンがわかる。
publicなはずだ。

# firewall-cmd --get-default-zone
public

以下だとIFも分かる
# firewall-cmd --get-active-zones
public
  interfaces: ens33

(2)サービスの起動と停止
①インストール
yum -y install firewalld
systemctl start firewalld
systemctl enable firewalld

②起動
systemctl start firewalld
 ※有効にするsystemctl enable firewalld
 ※AWSだと、firewalldそのものが入っていない。FWはセキュリティグループで設定するから不要なんだね。

③停止
検証などで、うまくいかない場合、FWを止めてみるのもありだ
systemctl stop firewalld

(3)現在の設定の確認
①firewall-cmd --list-all
全てをみることができる。interfaceの確認なども

[root@localhost ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources:
  services: ssh dhcpv6-client http
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

基本的にはデフォルトのzoneの状態が表示される。
ここで、sshやhttpが許可されていることがわかる

②現状を確認するのは以下
firewall-cmd --list-services --zone=public --permanent
※zoneはpublicとする
※--permanentを付けないと、permanentではないものも表示される。

http ssh ←こんな感じで、許可されているのが表示される

(4)ルールを追加
Firewallを開けるには、以下。

①httpを許可する
firewall-cmd --add-service=http --zone=public --permanent      
 ※--permanent によって、永続的にHTTPを開ける
・再起動 ★必須
firewall-cmd --reload  
・確認 iptalbeで確認するのが無難
iptables -L -n | grep 80

※iptables -L ですべてを確認する場合、IN_publicのallowとdenyを見ればいいと思う(あとで再確認)

②Proxy用のsquidの3128を開ける
# firewall-cmd --permanent --add-service=squid
squidは、デフォルトで3128になるように設定ファイルに書いてある
なので、ポートを変える場合はここを直す

# cat /usr/lib/firewalld/services/squid.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>squid</short>
  <description>Squid HTTP proxy server</description>
  <port protocol="tcp" port="3128"/>
</service>

③直接ポートを開ける
# firewall-cmd --zone=public --add-port=443/tcp --permanent
success

(5)ルールを削除(ポートを閉じる)
①squidのサービスのルールを削除
# firewall-cmd --permanent --remove-service=squid

※permanent有りのものと、無しのものは管理も区別されている。

####1.ユーザの作成
①ユーザの作成
#useradd user1
-sオプションで,ログインシェルを指定できます。
apacheなどでユーザを作るときは、そのユーザでログインできないように、以下としたりします。
-s /sbin/nologin
②パスワードの設定
#passwd user1

・パスワードの削除(たとえば、rootのPWを消す
# passwd -d root
→AWSのrootもPWは削除されています。

流し込みでPW変更 ※1行目はユーザ作成なので、必要に応じて。PWを新規作成にも、PW変更にもどちらでも使える。
useradd user1
echo user_pass | passwd --stdin user1

③その他:ユーザ作成時のグループ
ユーザを作る際、オプションを何もつけないと、新規のグループに所属する。
状態は、cat /etc/passwdでもいいしidコマンドでもいいだろう。
$ id testuser1
uid=1001(testuser1) gid=1001(testuser1) groups=1001(testuser1)

####2.ユーザの削除
userdel -r user1
※-rオプションで、ホームディレクトリも削除

####3.グループの管理
①グループの変更
chgrp

②ユーザにsudo権限を付与
sudo権限を持たせるのであれば、wheelグループに入れる
sudo usermod -aG wheel testuser1

※idコマンドでグループを確認するといいだろう。
# id testuser1
uid=1001(testuser1) gid=1001(testuser1) groups=1001(testuser1),10(wheel)

※ユーザがログイン中であれば、一度ログアウトをする必要があるだろう。

③グループにユーザを追加する。
# usermod -G apache user1
※確認には
id
# cat /etc/group | grep user1
# gpasswd -d user1 apache
※rootグループにuser1を追加することもやってみた。コマンドは成功するが、root権限が本当の意味で振られていない気がした。

④グループのユーザにアクセス権
・グループのユーザにも編集権限を与えるには以下のように775とする。※ポイントは2つ目の7
#chmod 775 /var/www/html

####4.設定ファイル
/etc/passwd・・・ユーザ情報が記載
/etc/shadow・・・パスワードの暗号化ファイル
/etc/group ・・・グループ情報が記載されている。グループ毎に、ユーザがカンマ区切りで列挙される。
 ※パスワードに関しては、/etc/gshadowがある

ユーザおよびパスワード関連のファイルには以下の2つがある
/etc/passwd
/etc/shadow
どういう違いがあるのか。
/etc/passwdにはユーザやグループの情報も記載されているので、パスワードファイルというよりはユーザ情報ファイルと考えた方がいい。これは、アクセス権としては管理者以外も誰でも見えるようになっている。
-rw-r--r-- 
しかし、パスワードそのものは、いくらハッシュしているとはいえ、一般ユーザが見えてしまっては困る。そこで、/etc/passwdではパスワードはxとだけ表示され、実質的には保存されていない。
かわりに、/etc/shadowファイルにハッシュ化(つまり暗号化)して保存されている。
・ユーザ(user1)のパスワードを変える
# passwd user1

####5.su
su - をつけると環境変数もrootに変える。まあ、-をつけなくてもいいかもね。
参考までに、su -をつけると環境変数も変わるので、以下のコマンドを打つと、USER="root"に変わっている。
# export
-が無いとそのまま

####6.sudoers 一般ユーザに権限を付与する
1)以下の設定ファイルを編集する。
vi /etc/sudoers

または、以下にあるように、/etc/sudoers.dをインクルードしているので、そこに配置してもいいだろう。
## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d

デフォルトだと、ec2-userがsudoできるように以下が記載されている。
# User rules for ec2-user
ec2-user ALL=(ALL) NOPASSWD:ALL

2)書き方
①以下のフォルダにファイルを作成する
includedir /etc/sudoers.d
例)
vi /etc/sudoers.d/test

②lastbをuser1が設定できるようにする。パスはwhichで調べよう。
user1 ALL=(ALL) NOPASSWD:/bin/lastb

echo "user1 ALL=(ALL) NOPASSWD:/bin/lastb" > /etc/sudoers.d/test

★Q.ユーザは再ログインする必要がある?-->不要

複数コマンドを並べることもできる。
user1 ALL=(ALL) NOPASSWD:/bin/lastb,/bin/docker

または、chmod o+r /var/log/btmp でファイルのアクセス権限を付与する。

3)コマンドの実行
sudo をつけて実行する
sudo lastb

4)複数ユーザを一気に変更する場合
ユーザをグループに入れて、そのグループに対して設定した方がいいだろう。
https://qiita.com/hana_shin/items/fe077d8910dba449b840

#### 7.ユーザの状態管理
(1)状態表示
・ユーザリスト
# cat /etc/passwd

・ログイン中のユーザの表示
# who
# w

直接ログインしている場合はtty(teletypewriter)と表示され、リモートなどから接続する場合はpts(pseudo terminal slave)と表示される

・(SSHやTelnetなどで)接続しているユーザを強制切断
まず、whoでログインしているユーザを見る。
そして、 ps ax | grep pts などと組み合わせで、どのユーザがどのプロセスかを確認する。
以下のコマンドで、プロセス番号を指定して切断
#kill -9 1274

・グループの表示
#id
[user@localhost ~]$ id
uid=1000(user) gid=1000(user) groups=1000(user)

(2)ログ管理
・ユーザが最終ログインしたのはいつか
#lastlog

・直近のログイン時間
#last
#last root  ←rootの直近のログイン
 ※rebootは再起動、pts/0はローカルログオン、
pts/1などの数字が入っている場合は、その横に
IPアドレスが入っていると思うが、SSHなどの接続

・ログイン失敗の履歴
#lastb
 ※攻撃の兆候などがわかるだろう
 ※内容は、/var/log/btmpを表示している。一般ユーザには読み取り権限がない。望ましくないが、付与するなら chmod o+r /var/log/btmp

・/var/log/secureログイン成功/ログイン失敗
 ログインだけでなく、パスワード変更、sudoコマンド実行などの履歴が表示される。

/boot ブート関連。カーネルなども
/etc  環境設定ファイル named.confなど
/home ユーザのホームディレクト
/tmp 一時ファイル 
/bin  binaryファイル(実行ファイル)がおかれる
/sbin SuperUserの実行ファイルが置かれる。
/var logなどの大きさが変化する(variable)ファイル
/dev
/usr

◆1.ネットワークの設定方法
0) CLIからGUIチックに設定する。
以前はnetconfigがあったが、今はなくなり、system-config-networkで可能になったが、CentOS7でまた変わった。あまり使う人はいないだろうがnmtuiがある。

1) /etc/sysconfig/network
システム全体のネットワーク設定をする。
(例)  
NETWORKING=yes  ←ネットワークを有効
HOSTNAME=localhost  ←ホスト名
DOMAINNAME=domain.dom  ←ドメイン名
GATEWAY=192.168.0.1  ←デフォルトゲートウェイ

※デフォルトゲートウェイは/etc/sysconfig/network-scripts/ifcfg-ethXに書いてもよいが、NICが複数ある場合、矛盾が起こる可能性がでてくる。デフォルトゲートウェイは1つであるべきなので、ここに書くべきでしょう。

2) /etc/hosts
Windowsのhostsファイルと同じ。Host名はここに書きましょう。 ※/etc/sysconfig/network にも記載できる?192.168.1.1 ns1.domain.dom ns1 ←最後の ns1は無くても良い。

デフォルトのファイルをみてみよう

# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost6 localhost6.localdomain6
なので、localhostにpingを打つと、このファイルをみて127.0.0.1に通信をする。
localhostはたまに使うが、DNSに問い合わせると無駄なパケットが流れるので、このhotsファイルに記載している。

3) /etc/resolv.conf 
ネームサーバの設定
(例)
search domain1.com 
nameserver 192.168.1.1
nameserver 192.168.1.2
※searchはドメイン名をというよりはドメインサフィックスと考えたほうがよいだろう。searchの場合、DNSサーバは3つまで指定できる。ドメインを指定する場合はdominで書く。1つまで。
→searchで書かれたドメインを自動補完してくれるはず
http://piyopiyocs.blog115.fc2.com/blog-entry-677.html
pingやホストコマンドで実行したが、うまくいかなかった。後日確認。

4) /etc/sysconfig/network-scripts/ifcfg-eth1に書き込む
最後のeth1の「1」は当然インターフェースによって変わる。

DEVICE=eth1 ←IF名 
BOOTPROTO=static DHCPの場合はdynamic
IPADDR=192.168.1.1 
NETMASK=255.255.255.0 

【補足】変更したネットワークを有効にするには
サービスを再起動する。
/etc/rc.d/init.d/network restart
または、service network restart

⇒Centos7では
systemctl enable network
systemctl enable start

5)nsswitch.conf
/etc/nsswitch.conf
名前解決の順番を指定する
# less /etc/nsswitch.conf
39行目あたりに、以下の記載がある。
hosts:      files dns myhostname
これにより、files(具体的には/etc/hosts)に書いた名前情報を最優先する。これはWindowsにあるhostsファイルと同じ。そして、次のDNSで名前解決をする。/etc/resolv.confで記載したDNSサーバである。
※じゃあ、myhostnameは何か。要調査

◆2.ネットワークの確認
1) ifconfig(interface configration)
現在のネットワークの状態を表示する。
※ifconfigにてIPアドレスを変更することもできるが、再起動すると元に戻ってしまう。

⇒Centos7では、ip a

2) nslookup、dig
名前解決のテストを行える。
終わるときはctrl+D

3) ホスト名の表示
hostname

4) ドメイン名の表示
hostname -d
※dはdomainの意味

■3.簡単に設定するにはnmtui
古いCentOSはnetconfigだったがnmtuiがある。CentOS7からはnmtuiを使う。
CLIベースのnmcliも便利といえば便利。

・nmtuiのインストール
#sudo yum -y install NetworkManager-tui

・サービスの起動
#systemctl start NetworkManager

・nmtuiの実行
#nmtui

■Viエディタ
viエディタを使えるようにしよう

・G  ファイルの最後の行へ移動
:番号 で該当行に移動する。(例)1G ファイルの1行目に移動

・wはWrite(保存)でqはQuit(終了)である。組み合わせも可能。
:wq 上書き保存して終了(ZZでもよい)
:q! 保存せずに終了

・行番号を表示する。
:set number   ※元に戻すには、 set nonumber

・置換
:[行指定]s/文字列1/文字列2/[g]

・行指定
n:n行目
%:ファイルのすべての行
$: 例えば 10,$s/文字列1/・・・としたら、10行目以降を置換。

・検索
文字列の検索は/を使って文字列を記載
s サーチ(置換コマンド)

・g 1行に複数あるときに全て置換する。指定しなければ、1つ目の文字のみ置換される。(cを使うことで、対話的置換も可能)

<例>
:%s/test/Test/g

・マウスの左右を同時にクリックすると、コピーペーストができる

・一気にコメントアウト、またはコメントアウトを外す
https://qiita.com/rato303/items/035de4117ec0022a0eb0

・文字化けしないように、UTF-8で保存するときは以下で保存
:set fileencoding=utf-8

■vim
エディタとしては、vim(viの改良版(iMproved))がいいだろう。恐らくデフォルトで入っていると思う。
以下で見てみるといいでしょう。
yum list | grep vim

CLIでも使える。また、viでは使えなかった、Windowsファイルでのメモ帳のクリップボードを張り付けなどもできる。
普通にCtrl+Vでできる。便利だ!

■GUIのエディタ
centos6とか7だと、geditがいいと思う

#ntpq -p
"*"が表示されれば同期がとれている。すぐにはとれない。
service ntpd startでサービスは起動すると思う

■クライアント側の設定
以下のコマンドを用いて同期をとる。
# /usr/sbin/ntpdate -bs 192.168.1.1
-bsはオプションなのでなくても良い。
※クライアントもntpdを起動し、上位のNTPサーバを参照するようにしてもいいが、NTPサーバが複数起動しているのもおかしい。要は、NTPクライアントとして動作したいだけなのに、わざわざNTPサーバを起動する必要はない。CRONで夜間に同期すればよいだろう

■時刻あわせ
# date --set="2003/10/8 16:20"
または、
date 100816202003

NTPサーバと同期をするには例えば以下(googleさんです)

■タイムゾーン
時刻設定について。これを変えておかないと、9時間ずれた時刻になる。

#現在の時刻を確認する。AWSのデフォルトだとズレているはず
data 
#timedatectlでタイムゾーンをTokyoに
timedatectl set-timezone Asia/Tokyo
#現在の時刻を確認する。 永続的に変更されている。
data 

再起動しても情報は保持される。
以下のように、設定ファイルを変更する方法もあるが、面倒なだけである。
ちなみに、上記の設定を変更しても、以下の設定ファイルは変更されない。

/etc/sysconfig/clock
ZONE="UTC"
UTC=true

なので、ZONE="Japan"にする
流し込むなら以下。

date
cp /etc/sysconfig/clock /etc/sysconfig/clock.org
sed -i /etc/sysconfig/clock \
-e "/ZONE=\"UTC\"/a ZONE=\"Japan\"" \
-e "/^ZONE/ s/^/#/"
cat /etc/sysconfig/clock
ln -sf /usr/share/zoneinfo/Japan /etc/localtime
reboot
ntpdate time.google.com

■SSH接続
ユーザを指定してSSH接続
ssh user1@10.1.1.1

(2)SSHでパスワードも入力する
yum install -y sshpass
すると、以下のように、SSH接続でPWも入力できる
sshpass -p admin ssh admin@172.31.42.73

■設定もろもろ
(1)設定ファイル

(2)SSHの公開鍵
(AWSの場合でやっているが、他でも同じで)、SSHの鍵は以下に入っている。
・フォルダ
/home/ec2-user/.ssh
→アクセス権は700になっている。
・ファイル
authorized_keys

秘密鍵は、AWSでEC2のインスタンスを作成するときに、作成しているはず。なので、ローカルのPCにあるだろう。

(3)他のユーザにも同じ秘密鍵でアクセスできるようにしてみよう。
①アカウントを作成
sudo adduser user1
sudo su - user1

②SSHの公開鍵を配置する場所は決められているので、正しく作る。
mkdir /home/user1/.ssh
chmod -R 700 /home/user1/.ssh

※etc/ssh/sshd_configの以下
AuthorizedKeysFile .ssh/authorized_keys

③上記のフォルダに公開鍵をコピーする。
exit
cp /home/ec2-user/.ssh/authorized_keys /home/user1/.ssh/authorized_keys

※PWを設定していないので、PW無しでログインできる。
※おそらくrootの権限になっていると思うので、user1にアクセス権を付与する(べきだと思う。私はそうした)

(4)SSHにおいて、パスワードだけでログインできるようにする。
AWSにおいては、秘密鍵による認証が必要で、パスワードだけの認証はできません。
設定としては、/etc/ssh/sshd_config の以下です。

#PasswordAuthentication yes
PasswordAuthentication no

※不要かもしれないが、sshdを再起動
systemctl restart sshd

ここをyesに変更し、ユーザを作成してPWを付与すればPW認証ができます。
# useradd testuser1
# passwd testuser1

・流し込むなら以下
#sshでのPWログインを許可する。
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.org
ls -la /etc/ssh/sshd_config*
sed -i '/^#PasswordAuthentication yes/ s/#//' /etc/ssh/sshd_config
sed -i '/^PasswordAuthentication no/ s/PasswordAuthentication no/#PasswordAuthentication no/' /etc/ssh/sshd_config
systemctl restart sshd

■3.SSHできるユーザを制限
(1)rootに関して
デフォルトでは、/etc/ssh/sshd_config において、以下がコメントアウトされているので、できない。
#PermitRootLogin yes

(2)それ以外において、SSHで、ユーザやIPアドレスを制限する。
①方法
方法はいくつかあるが、一例だけ
/etc/ssh/sshd_configのAllowUsersに設定を記載する。

#user2は172.31.0.0/24のセグメントからに限定。 ec2-userとuser1は制限なく利用できる。ここに記載しないユーザは利用不可。
AllowUsers user2@172.31.*.*
AllowUsers ec2-user user1

本来は1行でもできるはずだが、2行に分けないとうまくいかなかった。
これを記載したら、SSHアクセスさせるユーザを全て記載する必要がある。

②流し込み ※作成途中
#user1の追加
useradd user1
echo password | passwd --stdin user1
useradd user2
echo password | passwd --stdin user2

#設定ファイルのバックアップ
cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config.org

・パスワード認証を許可する
#PasswordAuthentication yes
PasswordAuthentication yes

・以下を追記
AllowUsers user2@172.31.*.*
AllowUsers ec2-user user1

#再起動
systemctl restart sshd

(3)SSHの同一ユーザでの同時接続数
設定ファイル /etc/ssh/sshd_config のMaxSessions で設定されていると思う。
ただ、デフォルトだとコメントアウトされていると思う。
#MaxSessions 10

◆1.概要
・リムーバルメディア(FD、CD)を利用するための操作。
・マウントはrootユーザーのみの権限
・UNIXやLinuxの種類によりパスは異なるが、次のように実行する
 mount /mnt/cdrom
・逆の操作はアンマウント(umount)

◆2.Floppyのマウント
コマンドからを実行する必要がある。外付けUSBドライブを接続しただけでは表示されない可能性が高い。
mount /mnt/floppy

◆3.USBメモリのマウント
①マウントポイントを作成する。
(例)mkdir /mnt/usb
②作成したマウントポイントにデバイスをマウントする。
mount -t vfat /dev/sda1 マウントポイント
※オプションの-tはファイルシステムのタイプを意味する
※vfatはFATの意味
※sda1はスペシャルデバイスのことで、sda1が使われていたら、sdb1、sdc1とつながっていく。

◆4.CDのマウント
カレントディレクトリをcdromにしてからマウントすると中身が見れない可能性がある。マウントしてから、cdromのディレクトリに移動すべき

◆5.マウントされたかの確認
dfコマンドで確認

◆6.自動認識
/etc/fstab に記述しておくことで,自動認識が可能になる.
/dev/sda1 /mnt/usb auto noauto,user,iocharset=utf9 0 0
※ちょっと怪しいので注意
mount -a により、ここで記載されたデバイスがすべてマウントされる。

◆7.アンマウント
umount マウントしていたCD-ROMドライブやFDドライブを取り外す操作
(例) umount /mnt/cdrom
※注意 カレントディレクトリがcdromだと「device is busy」になるので、必ずcdrom以外に移動してから行う。
※うまくいかない場合、一度画面をexitし、違う画面を立ち上げるとうまくいくときがある。

◆8.ディスクを取り出す
eject /mnt/cdrom

◆9.ループバックデバイスにマウント
以下より引用
https://github.com/ctfs/write-ups-2014/tree/master/seccon-ctf-2014/get-the-key-txt
ext2のファイルシステムをループバックデバイスにマウント

$ file forensic100
forensic100: Linux rev 1.0 ext2 filesystem data
Let’s try to mount it.

$ mkdir /tmp/forensic100

$ cd /tmp/forensic100

$ mount -o loop forensic100 /tmp/forensic100
※forensic100はフルパスを指定した方がいい。
$ ls
1    116  133  150  168  185  201  219  236 

・インストール
#yum -y install telnet telnet-server
※telnetはtelnetクライアント。これが無いと、telnetコマンドが実行できない。

・自動起動
# systemctl enable telnet.socket

・サービスの起動
# systemctl start telnet.socket
※デフォルトだと、rootではログインできない。

・rootでログインさせるには
/etc/securetty に追記

yum(Yellowdog Updater Modified)はRPMに比べて管理がしやすいパッケージ管理の仕組みです。
以下が参考になります。
https://www.atmarkit.co.jp/ait/articles/1608/29/news019.html

■パッケージのUpdate
・パッケージのUpdate。一気にUpdateできる
# yum update

・追加のパッケージでEPELも入れておくといいかも
# yum install epel-release

■パッケージのインストール
・たとえば、snmpを入れてみよう
# yum install net-snmp
 ※-yのオプションをつけると自動インストール。y or nが聞かれない

・perlのインストール
#yum install perl

・Java
Javaをインストールする。バ―ジョンなどはよくわっていないが、とりあえずこれで入ったような気がする。
yum install java-1.8.0-openjdk
yum install java-1.8.0-openjdk-devel
java -version

■パッケージがインストールされているかを知る
・yumでインストールしたリストを見る
#yum list installed | grep httpd

他にも方法はいくつかあると思います。
・rpmで確認
#rpm -qa | grep httpd
・バージョンで確認
#httpd -version

■パッケージを探す
・他には、system-config-firewallが入ってない場合、yumで探してみよう
yum search system-config-firewall
あった!
インストール(-yをつけた自動)は以下。
yum -y install system-config-firewall 

■yumの設定ファイル
/etc/yum.conf

■yumでパッケージのアンインストール
①以下はpostfixの場合
#yum -y remove postfix

②設定ファイルも基本的には消えるが、ゴミが残っている場合があるので、フォルダを消しておく
#rm -rf /etc/postfix/

③httpdのアンインストール
yum remove -y httpd apr apr-util httpd-tools

■yumでのエラー
updateがうまくいかない場合
以下のように、排他ロックがかかっている場合(lock)、killでプロセスを削除する
https://onoredekaiketsu.com/yum-sleeps-and-cant-be-executed/

↑このページのトップヘ