Red Hat Enterprise Linux 8.1 betaでのRed Hat Enterprise Linux 8.0からの新機能/変更点まとめ(1)
Red Hat Enterprise Linux(以下 RHEL) 8.1 betaが2019/07/24に公開されました。RHEL 8.0の際には導入に尻込みされていたユーザの方々も、8.1からは導入を考えられるかと思います。
ここでは、RHEL 8.1 betaのRHEL 8.0からの差分を簡単に纏めてみます。
RHEL 8.0の個々の新機能の紹介は、別途ブログで順次投稿していく予定です。
RHEL8.1betaでのRHEL8.0からの新機能/変更点まとめ記事の過去記事はこちらを参照ください。
RHEL 8.1 betaとRHEL 8.0との差分
ここでは、RHEL 8.1betaのRHEL 8.0からの差分の情報を、Red Hatのリリースノート(8.1 beta Release Notes: Chapter 4. New features)から抜き出してそれぞれ(順不同になってしまいますが)確認したいと思います。
リリースノートによると、RHEL 8.1 betaでの新しい機能としては
- The web console
- Installer and image creation
- Kernel
- Infrastructure services
- Dynamic programming languages, web and database servers
- Desktop
- Graphics infrastructures
- Hardware enablement
- Identity Management
- Compilers and development tools
- File systems and storage
- High availability and clusters
- Networking
- Security
があります。
順不同になっていまいますが、今回は、「14. Security」の新機能/変更点で、SELinuxの変更点の部分を簡単に纏めます。
尚、RHEL上のパッチの確認には、RHNのサイトからダウンロードできる、それぞれのパッケージのsrc.rpmからソースコード及びpatchとSPECファイルを参照しています。
14.Securityの新機能/変更点
14.1 SELinux
- SELinux Userspace
SELinux Userspace(libsepol, libselinux, checkpolicy等)が2.9になっています。SELinuxProjectはgithubで開発されており、Kernel Moduleやポリシ言語、setoolsなどそれぞれのリポジトリがあります。
SELinux UserspaceはgithubのWiki
で概要が紹介されています。
今回2.9になって変更された点は、Releases の2.9のRelease Notes にも載っていますが、主なバグフィックスと機能の変更です。ユーザレベルで見える点としては、下記のようなものになります。
- libselinuxのmanページ中の数カ所のスペルミスを修正しました(”all all policy”になってたり、”virulization”になっているような箇所の修正です)。
- ディレクトリを作成する前にlibsemanageがumaskをリセットするように修正しました(下記の部分は抜粋)。
if (stat(path, &sb) == -1) { if (errno == ENOENT && create) { + mask = umask(0077); if (mkdir(path, S_IRWXU) == -1) { + umask(mask);
- ROLE_REMOVE auditイベント(AUDIT_ROLE_REMOVE)で直前に使用していたユーザ名を正しく取得できるように修正しました。
diff -Nru selinux-20180524/libsemanage/src/seusers_local.c selinux-20190315/libsemanage/src/seusers_local.c --- selinux-20180524/libsemanage/src/seusers_local.c 2018-05-25 03:21:09.000000000 +0900 +++ selinux-20190315/libsemanage/src/seusers_local.c 2019-03-15 19:32:30.000000000 +0900 @@ -71,17 +71,18 @@ const char *sep = "-"; int rc = -1; strcpy(msg, "login"); + if (previous) { + name = semanage_seuser_get_name(previous); + psename = semanage_seuser_get_sename(previous); + pmls = semanage_seuser_get_mlsrange(previous); + proles = semanage_user_roles(handle, psename); + } if (seuser) { name = semanage_seuser_get_name(seuser); sename = semanage_seuser_get_sename(seuser); mls = semanage_seuser_get_mlsrange(seuser); roles = semanage_user_roles(handle, sename); } - if (previous) { - psename = semanage_seuser_get_sename(previous); - pmls = semanage_seuser_get_mlsrange(previous); - proles = semanage_user_roles(handle, psename); - } if (audit_type != AUDIT_ROLE_REMOVE) { if (sename && (!psename || strcmp(psename, sename) != 0)) { strcat(msg,sep);
- checkpolicyコマンドで出力される(重要でないノイズの)メッセージ、例えば下のようなものを削除しました。
diff -Nru selinux-20180524/checkpolicy/checkmodule.c selinux-20190315/checkpolicy/checkmodule.c --- selinux-20180524/checkpolicy/checkmodule.c 2018-05-25 03:21:09.000000000 +0900 +++ selinux-20190315/checkpolicy/checkmodule.c 2019-03-15 19:32:30.000000000 +0900 @@ -228,7 +228,6 @@ if (optind != argc) usage(argv[0]); } - printf("%s: loading policy configuration from %s\n", argv[0], file); /* Set policydb and sidtab used by libsepol service functions to my structures, so that I can directly populate and @@ -302,8 +301,6 @@ sepol_sidtab_destroy(&sidtab); - printf("%s: policy configuration loaded\n", argv[0]);
- checkpolicyに、バイナリポリシを出力する前にcontextでソートできるように’-S’ / ‘–sort’オプションを追加しました(下記は抜粋)。
diff -Nru selinux-20180524/checkpolicy/checkpolicy.c selinux-20190315/checkpolicy/checkpolicy.c --- selinux-20180524/checkpolicy/checkpolicy.c 2018-05-25 03:21:09.000000000 +0900 +++ selinux-20190315/checkpolicy/checkpolicy.c 2019-03-15 19:32:30.000000000 +0900 @@ -111,9 +111,9 @@ static __attribute__((__noreturn__)) void usage(const char *progname) { printf - ("usage: %s [-b[F]] [-C] [-d] [-U handle_unknown (allow,deny,reject)] [-M]" - "[-c policyvers (%d-%d)] [-o output_file] [-t target_platform (selinux,xen)]" - "[input_file]\n", + ("usage: %s [-b[F]] [-C] [-d] [-U handle_unknown (allow,deny,reject)] [-M] " + "[-c policyvers (%d-%d)] [-o output_file] [-S] " + "[-t target_platform (selinux,xen)] [-V] [input_file]\n", progname, POLICYDB_VERSION_MIN, POLICYDB_VERSION_MAX); exit(1); } @@ -394,7 +394,7 @@ size_t scontext_len, pathlen; unsigned int i; unsigned int protocol, port; - unsigned int binary = 0, debug = 0, cil = 0, conf = 0; + unsigned int binary = 0, debug = 0, sort = 0, cil = 0, conf = 0; struct val_to_name v; int ret, ch, fd, target = SEPOL_TARGET_SELINUX; unsigned int nel, uret; @@ -418,11 +418,12 @@ {"mls", no_argument, NULL, 'M'}, {"cil", no_argument, NULL, 'C'}, {"conf",no_argument, NULL, 'F'}, + {"sort", no_argument, NULL, 'S'}, {"help", no_argument, NULL, 'h'}, {NULL, 0, NULL, 0} };
- dbus設定ファイルでの重複したat_consoleステートメントを削除しました。
diff -Nru selinux-20180524/dbus/org.selinux.conf selinux-20190315/dbus/org.selinux.conf --- selinux-20180524/dbus/org.selinux.conf 2018-05-25 03:21:09.000000000 +0900 +++ selinux-20190315/dbus/org.selinux.conf 2019-03-15 19:32:30.000000000 +0900 @@ -12,12 +12,8 @@ - - - - +
- manページのロシア語対応。例えば下のようなものになります。
diff -Nru selinux-20180524/libselinux/man/ru/man5/customizable_types.5 selinux-20190315/libselinux/man/ru/man5/customizable_types.5 --- selinux-20180524/libselinux/man/ru/man5/customizable_types.5 1970-01-01 09:00:00.000000000 +0900 +++ selinux-20190315/libselinux/man/ru/man5/customizable_types.5 2019-03-15 19:32:30.000000000 +0900
- /usr/bin/python3をPythonのデフォルトとして指定。
- ディレクトリを作成する前にlibsemanageがumaskをリセットするように修正しました(下記の部分は抜粋)。
以下は、本来のソースコードでは対応していませんでしたが、RHEL8.0の時点でRed Hatの方で既にパッチを充てていてサポートされているものになります。
- audit2whyが一般ユーザでも実行できるようになりました。ただし、こちらに関しては、RHEL8.0の時点で既にサポートされています。
- audit2allowのxperms対応。ただし、こちらに関しては、RHEL8.0の時点でselinux-python-2.8に下記のようなパッチ(抜粋)があたっているので既にサポートされています。
--- selinux-python-2.8/audit2allow/audit2allow +++ selinux-python-2.8/audit2allow/audit2allow @@ -86,6 +86,8 @@ class AuditToPolicy: dest="type") parser.add_option("--perm-map", dest="perm_map", help="file name of per m map") parser.add_option("--interface-info", dest="interface_info", help="file name of interface information") + parser.add_option("-x", "--xperms", action="store_true", dest="xperms", + default=False, help="generate extended permission rul es") parser.add_option("--debug", dest="debug", action="store_true", default =False, help="leave generated modules for -M") parser.add_option("-w", "--why", dest="audit2why", action="store_true", default=(os.path.basename(sys.argv[0]) == "audit2why"), @@ -314,6 +316,10 @@ class AuditToPolicy: ifs, perm_maps = self.__load_interface_info() g.set_gen_refpol(ifs, perm_maps) + # Extended permissions + if self.__options.xperms: + g.set_gen_xperms(True)
- semanage login で2つのauditイベントのうちの一つが正しかった場合にログに取得しないようにする修正。ただし、こちらに関しては、RHEL8.0の時点でselinux-python-2.8に下記のようなパッチ(抜粋)があたっているので既にサポートされています。
if add_ind: - cmd = "semanage login -a -r %s -s %s %s" % (new_serange, user[0], u) + cmd = ["semanage", "login", "-a", "-r", new_serange, "-s", user[0], u] else: - cmd = "semanage login -m -r %s -s %s %s" % (new_serange, user[0], u) - rc = getstatusoutput(cmd) - if rc[0] != 0: - print(rc[1]) + cmd = ["semanage", "login", "-m", "-r", new_serange, "-s", user[0], u] + try: + subprocess.check_call(cmd, stderr=subprocess.STDOUT, shell=False) + except subprocess.CalledProcessError: errors += 1
- semanage export の出力がibpkey/ibendpointを含むように修正しました。ただし、こちらに関しては、RHEL8.0の時点でselinux-python-2.8に下記のようなパッチ(抜粋)があたっているので既にサポートされています。
@@ -1603,6 +1621,8 @@ class ibendportRecords(semanageRecords): if type == "": raise ValueError(_("Type is required")) + type = sepolicy.get_real_type_name(type) + if type not in self.valid_types: raise ValueError(_("Type %s is invalid, must be an ibendport type") % type) (k, ibendport, port) = self.__genkey(ibendport, ibdev_name) @@ -1664,6 +1684,8 @@ class ibendportRecords(semanageRecords): else: raise ValueError(_("Requires setype"))
- sepolicy/semanageがaliasを許可するようになりました。ただし、こちらに関しては、RHEL8.0の時点でselinux-python-2.8に下記のようなパッチ(抜粋)があたっているので既にサポートされています。
@@ -168,15 +180,21 @@ except ValueError as e: def info(setype, name=None): if setype == TYPE: q = setools.TypeQuery(_pol) - if name: - q.name = name + q.name = name + results = list(q.results()) + + if name and len(results) < 1: + # type not found, try alias + q.name = None + q.alias = name + results = list(q.results())
- SETools
SEToolsのバージョンが4.2.2になりました。
- setoolsのmanページの修正に”binary”を追加しました。例えば下のようなものになります。
+\fBapol\fR supports loading SELinux policies in one of two formats. +.RS +.IP "source:" +A single text file containing a monolithic policy source. This file is usually named policy.conf. +.IP "binary:" A single file containing a binary policy. This file is usually named by version on Linux systems, for example, \fIpolicy.30\fR. This file is usually named \fIs epolicy\fR on Android systems. +.RE +.PP
- Aliasのロード時間を早くするためにハッシュテーブルなど諸々を新たに定義してパフォーマンスを上げています。
+cdef class CategoryAliasHashtabIterator(HashtabIterator): + + """Iterate over category aliases in the policy.""" + + cdef uint32_t primary + + @staticmethod + cdef factory(SELinuxPolicy policy, sepol.hashtab_t *table, Category primary ): + """Factory function for creating category alias iterators.""" + i = CategoryAliasHashtabIterator() + i.policy = policy + i.table = table + i.primary = primary._value + i.reset() + return i
- Boolean
RHEL 8.1になって、SELinuxポリシを調整できるbooleanに下記の4項目が増えているようです。
- container_use_cephfs
- コンテナがcephfsを使えるようにします(デフォルト:OFF)。
- deny_bluetooth
- bluetoothを使えないようにします(デフォルト:OFF)。
- logrotate_use_fusefs
- logrotateがfusefsを使えないようにします(デフォルト:OFF)。
- unconfined_dyntrans_all
- こちらのunconfinedマニュアルにも記載が有りますが、これを有効にすることで、setcon(3) :( libselinux-develパッケージに付属)を使用してプロセスをunconfinedドメインから別のドメインに動的に変更することが出来ます。
次回予告
今回はここまでです。次回は同じくセキュリティのOpenSCAPの修正点とその他を簡単に纏めます。
コメント
[…] 今回は前回に引き続き、「14. Security」の新機能/変更点での残りの項目を簡単に纏めます。 […]