出来る限り最小限の権限しか持たないOracleメンテナンス用のユーザを作成する。また、定期的にOracleから情報を取得する。


## 概要
以下の作業のみ実施することができる、OSユーザ"oramnt"とOracleユーザ"ops$oramnt"を作成する。

- OSユーザoramntが使用できるOSコマンドは「sqlplus」「exit」のみ。他のコマンドは極力使用できないよう設定。
- OSユーザoramntは、oracleにsqlplusでログインし、「セッション情報」「表領域の使用量」を取得出来る。
- OSユーザoramntは、cronで定期的に「セッション情報」「表領域の使用量」を取得する。
- Oracleユーザops$oramntは、「接続」「セッション情報の取得」「表領域の使用量の取得」以外は何もできない。

## 内容

- OSとOracleはインストール済みとする。
- 制限付きのbash"rbash"を使用する。
- bashの補完機能は無効にする。
- .bash_profile、.inputrcはrootが保持し、oramntユーザが更新できないようにする。
- oramntユーザに実行を許可するコマンドは"/home/oramnt/bin"に配置する。<br>
  シンボリックリンクを作成するか、実行ファイルを直接配置する。
- "/home/oramnt/bin"に配置したコマンド以外は、極力使用できないように設定する。
- oracleへのログイン認証はOS_AUTHENT_PREFIXを使用した外部認証を使用する。<br>
    (パスワードなしでのログインを想定)<br>
  OS_AUTHENT_PREFIXはデフォルトのops\$を使用し、ops$oramntユーザを作成する。
- 「セッション情報」「表領域の使用量」はビューを作成し取得するようにする。
    所有者はsysとし、ビュー名は以下とする。
    セッション情報 → view_sinfo
    表領域の使用量 → view_dinfo
    ※今回は手間を省くためsysスキーマに作成しているが、通常はこのようなことをしてはいけない。

- ops$oramntは、view_sinfo/view_dinfoのselectのみ実行できる。

## 環境構成

▼ OS

```bash:
$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 6.4 (Santiago)
```

▼ Oracle

```sql:
SQL> select * from V$VERSION;
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE    11.2.0.4.0      Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production

```


## 手順
### OSユーザ「oramnt」作成

```bash:
su -

# ユーザ作成
useradd oramnt
passwd oramnt

# 制限付きシェルの設定
# ※ bashのシンボリックリンク"rbash"を作成し起動すると、制限付きのシェルになる
ln -s /bin/bash /bin/rbash
vi /etc/shells
# 以下を追記する。
# #-------------------
# /bin/rbash
# #-------------------

# oramntユーザにシェルスクリプトを設定
su - oramnt
chsh
# oramnt のシェルを変更します。
# パスワード:
# 新しいシェル [/bin/bash]: /bin/rbash
# シェルを変更しました。
exit

# oramntユーザの実行を許可するコマンドを配置するディレクトリの作成
mkdir /home/oramnt/bin

# .bash_profileの設定
# .bash_profileをrootに変更。oramntユーザが変更できないように設定する。
chown root:root /home/oramnt/.bash_profile
ls -l /home/oramnt/.bash_profile
vi /home/oramnt/.bash_profile
# 以下を追記する。
# #-------------------
# umask 077                     # 所有者のみアクセス可能
# export PATH=/home/oramnt/bin  # このディレクトリに実行を許可するコマンドを配置
# #-------------------

# bashの補完機能を無効にする。
vi /home/oramnt/.inputrc
# 以下を追記する。
# #-------------------
# set disable-completion on
# #-------------------
chown root:root /home/oramnt/.inputrc
ls -l /home/oramnt/.inputrc
```

▼ bashのビルドインコマンドを無効化する。

``` bash:
# helpコマンドで内部コマンドを確認し、enableコマンドで無効化する。
# 以下のコマンドは無効化しない。
# - exit
# - echo,printf (rbashの動作がおかしくなる)
# - enableコマンドを実行すると、エラー "-rbash: enable: *******: not a shell builtin"が出るコマンド
# enableコマンドの無効化は最後に実行する。 ※enableコマンドはrbashで実行できないため、無効化しなくても問題ない)

su -
vi /home/oramnt/.bash_profile
# 以下を追記する。
# #-------------------
# enable -n alias
# enable -n bg
# enable -n bind
# enable -n break
# enable -n builtin
# enable -n caller
# enable -n cd
# enable -n command
# enable -n compgen
# enable -n complete
# enable -n compopt
# enable -n continue
# enable -n declare
# enable -n dirs
# enable -n disown
# enable -n eval
# enable -n exec
# enable -n export
# enable -n fc
# enable -n fg
# enable -n getopts
# enable -n hash
# enable -n help
# enable -n history
# enable -n jobs
# enable -n kill
# enable -n let
# enable -n local
# enable -n logout
# enable -n mapfile
# enable -n popd
# enable -n pushd
# enable -n pwd
# enable -n read
# enable -n readarray
# enable -n readonly
# enable -n return
# enable -n set
# enable -n shift
# enable -n shopt
# enable -n source
# enable -n suspend
# enable -n test
# enable -n times
# enable -n trap
# enable -n type
# enable -n typeset
# enable -n ulimit
# enable -n umask
# enable -n unalias
# enable -n unset
# enable -n wait
# enable -n enable
# #-------------------

# 動作確認
su - oramnt

# 実行できないことを確認
ls    
# -rbash: ls: コマンドが見つかりません

# 実行できないことを確認
kill  
# -rbash: kill: コマンドが見つかりません
```

### Oracle関連の設定

▼ メンテナンス用Oracleユーザ「ops$oramnt」の作成

``` sql:
su - oracle

-- viewの作成
sqlplus / as sysdba
create view view_sinfo as select sid,serial#,username,osuser,program,machine from v$session where type = 'USER';
create view view_dinfo as
WITH
T AS (
  SELECT TABLESPACE_NAME, SUM(BYTES)/1024/1024 "MBYTES" FROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME
  UNION ALL
  SELECT TABLESPACE_NAME, SUM(BYTES)/1024/1024 "MBYTES" FROM DBA_TEMP_FILES GROUP BY TABLESPACE_NAME) ,
F AS (
  SELECT TABLESPACE_NAME, SUM(BYTES)/1024/1024 "MBYTES" FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME
  UNION ALL
  SELECT TABLESPACE_NAME, SUM(BYTES_FREE)/1024/1024 "MBYTES" FROM V$TEMP_SPACE_HEADER GROUP BY TABLESPACE_NAME)
SELECT
  T.TABLESPACE_NAME          "TABLESPACE_NAME",
  TRUNC(T.MBYTES,1)          "TOTAL (MB)",
  TRUNC(NVL(F.MBYTES, 0),1)  "FREE (MB)",
  TRUNC(DECODE(T.MBYTES, 0 , 0, (1-NVL(F.MBYTES,0)/T.MBYTES)*100),1) "USED (%)"
FROM T, F
WHERE T.TABLESPACE_NAME = F.TABLESPACE_NAME (+)
ORDER BY T.TABLESPACE_NAME;

select * from view_sinfo;
select * from view_dinfo;


-- メンテ用ユーザの作成
-- os_authent_prefixパラメータ確認
show parameter os_authent_prefix
-- ops$

-- ユーザ作成
create user ops$oramnt identified externally;
grant create session to ops$oramnt;
grant select on sys.view_sinfo to ops$oramnt;
grant select on sys.view_dinfo to ops$oramnt;
exit

```

▼ sqlplus接続設定

``` bash:
su -
# sqlplusを実行できるように/home/oramnt/binにシンボリックリンクを配置。
ln -s /u01/app/oracle/product/11.2.0/dbhome_1/bin/sqlplus /home/oramnt/bin/sqlplus

# .bash_profileにoracle環境設定
vi /home/oramnt/.bash_profile
# 以下を追記する。（環境に合わせる）
# #-------------------
# export ORACLE_BASE=/u01/app/oracle
# export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1
# export ORACLE_SID=TEST01
# export LANG=ja_JP.UTF-8
# #-------------------

# 動作確認
su - oramnt
echo "select * from sys.view_sinfo;" | sqlplus -S /
echo "select * from sys.view_dinfo;" | sqlplus -S /
exit

```

### スクリプトの定期的実行設定

▼Oracleから情報を取得するスクリプトの作成

``` bash:
su -

# スクリプトファイルの作成
vi /home/oramnt/bin/orainf.sh
# 以下を記載する。
# #-------------------
# #!/bin/sh
# echo "select * from sys.view_sinfo;" | sqlplus -S /
# echo "select * from sys.view_dinfo;" | sqlplus -S /
# #-------------------

# ファイルの権限変更
chmod 700 /home/oramnt/bin/orainf.sh
chown oramnt:oramnt /home/oramnt/bin/orainf.sh
# 確認
ls -l /home/oramnt/bin/orainf.sh

su - oramnt
orainf.sh
exit
```

▼cronへの登録(rootユーザで実施)
今回は1分毎にorainf.shを実行するように設定。

``` bash:
su -

# oramntユーザのcronに登録
crontab -u oramnt -e
# 以下を追加
# # -------------------
# */1 * * * * orainf.sh > orainf.log
# # -------------------

# 登録内容の確認
crontab -u oramnt -l

# 動作確認
# 1分毎に以下のファイルが更新されていることを確認
ls -l /home/oramnt/orainf.log
cat /home/oramnt/orainf.log
```