Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
inclavare-containers
提交
f822dc13
I
inclavare-containers
项目概览
openanolis
/
inclavare-containers
通知
4
Star
7
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
5
列表
看板
标记
里程碑
合并请求
0
分析
仓库
DevOps
项目成员
Pages
I
inclavare-containers
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
5
Issue
5
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
f822dc13
编写于
6月 27, 2020
作者:
jia zhang
提交者:
GitHub
6月 27, 2020
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
rune: Code cleanup
Signed-off-by:
Jia Zhang
<
zhang.jia@linux.alibaba.com
>
上级
9777f5ca
变更
14
隐藏空白更改
内联
并排
Showing
14 changed file
with
112 addition
and
165 deletion
+112
-165
rune/libcontainer/configs/enclave.go
rune/libcontainer/configs/enclave.go
+0
-1
rune/libcontainer/configs/validate/validator.go
rune/libcontainer/configs/validate/validator.go
+1
-11
rune/libcontainer/container_linux.go
rune/libcontainer/container_linux.go
+3
-11
rune/libcontainer/factory_linux.go
rune/libcontainer/factory_linux.go
+4
-4
rune/libcontainer/nsenter/enclave.c
rune/libcontainer/nsenter/enclave.c
+26
-27
rune/libcontainer/nsenter/nsexec.c
rune/libcontainer/nsenter/nsexec.c
+19
-19
rune/libcontainer/process_linux.go
rune/libcontainer/process_linux.go
+0
-4
rune/libcontainer/setns_init_linux.go
rune/libcontainer/setns_init_linux.go
+11
-7
rune/libcontainer/specconv/spec_linux.go
rune/libcontainer/specconv/spec_linux.go
+0
-6
rune/libcontainer/standard_init_linux.go
rune/libcontainer/standard_init_linux.go
+26
-21
rune/libenclave/bootstrap.go
rune/libenclave/bootstrap.go
+0
-39
rune/libenclave/configs/config.go
rune/libenclave/configs/config.go
+0
-2
rune/libenclave/internal/runtime/enclave_runtime.go
rune/libenclave/internal/runtime/enclave_runtime.go
+2
-1
rune/libenclave/runelet.go
rune/libenclave/runelet.go
+20
-12
未找到文件。
rune/libcontainer/configs/enclave.go
浏览文件 @
f822dc13
...
@@ -10,5 +10,4 @@ type Enclave struct {
...
@@ -10,5 +10,4 @@ type Enclave struct {
Type
string
`json:"type"`
Type
string
`json:"type"`
Path
string
`json:"path"`
Path
string
`json:"path"`
Args
string
`json:"args,omitempty"`
Args
string
`json:"args,omitempty"`
Signer
string
`json:"signer,omitempty"`
}
}
rune/libcontainer/configs/validate/validator.go
浏览文件 @
f822dc13
...
@@ -6,7 +6,6 @@ import (
...
@@ -6,7 +6,6 @@ import (
"path/filepath"
"path/filepath"
"strings"
"strings"
securejoin
"github.com/cyphar/filepath-securejoin"
"github.com/opencontainers/runc/libcontainer/configs"
"github.com/opencontainers/runc/libcontainer/configs"
"github.com/opencontainers/runc/libcontainer/intelrdt"
"github.com/opencontainers/runc/libcontainer/intelrdt"
"github.com/opencontainers/runc/libenclave"
"github.com/opencontainers/runc/libenclave"
...
@@ -221,16 +220,7 @@ func (v *ConfigValidator) enclave(config *configs.Config) error {
...
@@ -221,16 +220,7 @@ func (v *ConfigValidator) enclave(config *configs.Config) error {
return
fmt
.
Errorf
(
"enclave runtime path is not configured"
)
return
fmt
.
Errorf
(
"enclave runtime path is not configured"
)
}
}
path
:=
config
.
Enclave
.
Path
if
_
,
err
:=
os
.
Stat
(
config
.
Enclave
.
Path
);
err
!=
nil
{
if
config
.
Enclave
.
Signer
!=
"server"
{
var
err
error
path
,
err
=
securejoin
.
SecureJoin
(
config
.
Rootfs
,
path
)
if
err
!=
nil
{
return
err
}
}
if
_
,
err
:=
os
.
Stat
(
path
);
err
!=
nil
{
return
err
return
err
}
}
...
...
rune/libcontainer/container_linux.go
浏览文件 @
f822dc13
...
@@ -528,23 +528,15 @@ func (c *linuxContainer) commandTemplate(p *Process, childInitPipe *os.File, chi
...
@@ -528,23 +528,15 @@ func (c *linuxContainer) commandTemplate(p *Process, childInitPipe *os.File, chi
if
agentPipe
!=
nil
{
if
agentPipe
!=
nil
{
cmd
.
ExtraFiles
=
append
(
cmd
.
ExtraFiles
,
agentPipe
)
cmd
.
ExtraFiles
=
append
(
cmd
.
ExtraFiles
,
agentPipe
)
cmd
.
Env
=
append
(
cmd
.
Env
,
cmd
.
Env
=
append
(
cmd
.
Env
,
fmt
.
Sprintf
(
"_LIB
CONTAINER
_AGENTPIPE=%d"
,
stdioFdCount
+
len
(
cmd
.
ExtraFiles
)
-
1
))
fmt
.
Sprintf
(
"_LIB
ENCLAVE
_AGENTPIPE=%d"
,
stdioFdCount
+
len
(
cmd
.
ExtraFiles
)
-
1
))
}
}
if
c
.
config
.
Enclave
.
Path
!=
""
{
if
c
.
config
.
Enclave
.
Path
!=
""
{
cmd
.
Env
=
append
(
cmd
.
Env
,
"_LIBCONTAINER_PAL_PATH="
+
c
.
config
.
Enclave
.
Path
)
cmd
.
Env
=
append
(
cmd
.
Env
,
"_LIBENCLAVE_PAL_PATH="
+
c
.
config
.
Enclave
.
Path
)
}
if
c
.
config
.
Enclave
.
Signer
!=
"server"
{
cmd
.
Env
=
append
(
cmd
.
Env
,
"_LIBCONTAINER_PAL_ROOTFS="
+
c
.
config
.
Rootfs
)
}
}
if
detached
{
if
detached
{
cmd
.
Env
=
append
(
cmd
.
Env
,
cmd
.
Env
=
append
(
cmd
.
Env
,
"_LIBENCLAVE_DETACHED=1"
)
fmt
.
Sprintf
(
"_LIBCONTAINER_DETACHED=%d"
,
1
))
}
else
{
cmd
.
Env
=
append
(
cmd
.
Env
,
fmt
.
Sprintf
(
"_LIBCONTAINER_DETACHED=%d"
,
0
))
}
}
}
}
...
...
rune/libcontainer/factory_linux.go
浏览文件 @
f822dc13
...
@@ -346,8 +346,8 @@ func (l *LinuxFactory) StartInitialization() (err error) {
...
@@ -346,8 +346,8 @@ func (l *LinuxFactory) StartInitialization() (err error) {
envConsole
=
os
.
Getenv
(
"_LIBCONTAINER_CONSOLE"
)
envConsole
=
os
.
Getenv
(
"_LIBCONTAINER_CONSOLE"
)
envLogPipe
=
os
.
Getenv
(
"_LIBCONTAINER_LOGPIPE"
)
envLogPipe
=
os
.
Getenv
(
"_LIBCONTAINER_LOGPIPE"
)
envLogLevel
=
os
.
Getenv
(
"_LIBCONTAINER_LOGLEVEL"
)
envLogLevel
=
os
.
Getenv
(
"_LIBCONTAINER_LOGLEVEL"
)
envAgentPipe
=
os
.
Getenv
(
"_LIB
CONTAINER
_AGENTPIPE"
)
envAgentPipe
=
os
.
Getenv
(
"_LIB
ENCLAVE
_AGENTPIPE"
)
envDetached
=
os
.
Getenv
(
"_LIB
CONTAINER
_DETACHED"
)
envDetached
=
os
.
Getenv
(
"_LIB
ENCLAVE
_DETACHED"
)
)
)
// Get the INITPIPE.
// Get the INITPIPE.
...
@@ -391,7 +391,7 @@ func (l *LinuxFactory) StartInitialization() (err error) {
...
@@ -391,7 +391,7 @@ func (l *LinuxFactory) StartInitialization() (err error) {
if
envAgentPipe
!=
""
{
if
envAgentPipe
!=
""
{
agent
,
err
:=
strconv
.
Atoi
(
envAgentPipe
)
agent
,
err
:=
strconv
.
Atoi
(
envAgentPipe
)
if
err
!=
nil
{
if
err
!=
nil
{
return
fmt
.
Errorf
(
"unable to convert _LIB
CONTAINER
_AGENTSOCK=%s to int: %s"
,
envAgentPipe
,
err
)
return
fmt
.
Errorf
(
"unable to convert _LIB
ENCLAVE
_AGENTSOCK=%s to int: %s"
,
envAgentPipe
,
err
)
}
}
agentPipe
=
os
.
NewFile
(
uintptr
(
agent
),
"agent-pipe"
)
agentPipe
=
os
.
NewFile
(
uintptr
(
agent
),
"agent-pipe"
)
defer
agentPipe
.
Close
()
defer
agentPipe
.
Close
()
...
@@ -400,7 +400,7 @@ func (l *LinuxFactory) StartInitialization() (err error) {
...
@@ -400,7 +400,7 @@ func (l *LinuxFactory) StartInitialization() (err error) {
if
envDetached
!=
""
{
if
envDetached
!=
""
{
tmpDetached
,
err
:=
strconv
.
Atoi
(
envDetached
)
tmpDetached
,
err
:=
strconv
.
Atoi
(
envDetached
)
if
err
!=
nil
{
if
err
!=
nil
{
return
fmt
.
Errorf
(
"unable to convert _LIB
CONTAINER
_DETACHED=%s to int: %s"
,
envDetached
,
err
)
return
fmt
.
Errorf
(
"unable to convert _LIB
ENCLAVE
_DETACHED=%s to int: %s"
,
envDetached
,
err
)
}
}
if
tmpDetached
!=
0
{
if
tmpDetached
!=
0
{
detached
=
true
detached
=
true
...
...
rune/libcontainer/nsenter/
loader
.c
→
rune/libcontainer/nsenter/
enclave
.c
浏览文件 @
f822dc13
...
@@ -4,6 +4,7 @@
...
@@ -4,6 +4,7 @@
#include <stdlib.h>
#include <stdlib.h>
#include <string.h>
#include <string.h>
#include <dlfcn.h>
#include <dlfcn.h>
#include <stdbool.h>
#include <linux/limits.h>
#include <linux/limits.h>
/* Defined in nsexec.c. */
/* Defined in nsexec.c. */
...
@@ -15,7 +16,8 @@
...
@@ -15,7 +16,8 @@
#define INFO "info"
#define INFO "info"
#define DEBUG "debug"
#define DEBUG "debug"
void
write_log_with_info
(
const
char
*
level
,
const
char
*
function
,
int
line
,
const
char
*
format
,
...);
void
write_log_with_info
(
const
char
*
level
,
const
char
*
function
,
int
line
,
const
char
*
format
,
...);
#define write_log(level, fmt, ...) \
#define write_log(level, fmt, ...) \
write_log_with_info((level), __FUNCTION__, __LINE__, (fmt), ##__VA_ARGS__)
write_log_with_info((level), __FUNCTION__, __LINE__, (fmt), ##__VA_ARGS__)
...
@@ -27,58 +29,55 @@ void *fptr_pal_kill;
...
@@ -27,58 +29,55 @@ void *fptr_pal_kill;
void
*
fptr_pal_destroy
;
void
*
fptr_pal_destroy
;
void
*
fptr_pal_create_process
;
void
*
fptr_pal_create_process
;
int
is_enclave
(
void
)
bool
enclave_configured
(
void
)
{
{
const
char
*
env
;
const
char
*
p
=
getenv
(
"_LIBENCLAVE_PAL_PATH"
);
env
=
getenv
(
"_LIBCONTAINER_PAL_PATH"
);
if
(
p
==
NULL
||
*
p
==
'\0'
)
if
(
env
==
NULL
||
*
env
==
'\0'
)
return
false
;
return
0
;
return
true
;
return
1
;
}
bool
is_init_runelet
(
void
)
{
const
char
*
type
=
getenv
(
"_LIBCONTAINER_INITTYPE"
);
if
(
type
==
NULL
||
*
type
==
'\0'
)
return
false
;
return
!
strcmp
(
type
,
"standard"
);
}
}
int
load_enclave_runtime
(
void
)
int
load_enclave_runtime
(
void
)
{
{
char
pal_full_path
[
PATH_MAX
+
1
];
char
*
pal_path
;
char
*
pal_path
;
const
char
*
rootfs
;
void
*
dl
;
void
*
dl
;
pal_path
=
getenv
(
"_LIB
CONTAINER
_PAL_PATH"
);
pal_path
=
getenv
(
"_LIB
ENCLAVE
_PAL_PATH"
);
if
(
pal_path
==
NULL
||
*
pal_path
==
'\0'
)
{
if
(
pal_path
==
NULL
||
*
pal_path
==
'\0'
)
{
write_log
(
DEBUG
,
"invalid environment _LIBCONTAINER_PAL_PATH"
);
write_log
(
ERROR
,
"_LIBENCLAVE_PAL_PATH should not be empty"
);
return
0
;
/* set errno correctly, make bail() work better */
errno
=
EINVAL
;
return
-
1
;
}
}
write_log
(
DEBUG
,
"_LIBCONTAINER_PAL_PATH = %s"
,
pal_path
);
write_log
(
DEBUG
,
"_LIBENCLAVE_PAL_PATH=%s"
,
pal_path
);
write_log
(
DEBUG
,
"LD_LIBRARY_PATH = %s"
,
getenv
(
"LD_LIBRARY_PATH"
));
rootfs
=
getenv
(
"_LIBCONTAINER_PAL_ROOTFS"
);
if
(
rootfs
&&
*
rootfs
!=
'\0'
)
{
snprintf
(
pal_full_path
,
sizeof
(
pal_full_path
)
-
1
,
"%s/%s"
,
rootfs
,
pal_path
);
pal_path
=
pal_full_path
;
}
dl
=
dlopen
(
pal_path
,
RTLD_NOW
);
dl
=
dlopen
(
pal_path
,
RTLD_NOW
);
unsetenv
(
"LD_LIBRARY_PATH"
);
if
(
dl
==
NULL
)
{
if
(
dl
==
NULL
)
{
write_log
(
DEBUG
,
"dlopen(): %s"
,
dlerror
());
write_log
(
ERROR
,
"failed to dlopen(): %s"
,
dlerror
());
/* set errno correctly, make bail() work better */
return
-
1
;
errno
=
ENOEXEC
;
return
-
ENOEXEC
;
}
}
#define DLSYM(fn) \
#define DLSYM(fn) \
do { \
do { \
fptr_pal_ ## fn = dlsym(dl, "pal_" #fn); \
fptr_pal_ ## fn = dlsym(dl, "pal_" #fn); \
write_log(DEBUG, "dlsym(%s)
=
%p", "pal_" #fn, fptr_pal_ ## fn); \
write_log(DEBUG, "dlsym(%s)
=
%p", "pal_" #fn, fptr_pal_ ## fn); \
} while (0)
} while (0)
DLSYM
(
get_version
);
DLSYM
(
get_version
);
DLSYM
(
init
);
DLSYM
(
init
);
DLSYM
(
create_process
);
DLSYM
(
exec
);
DLSYM
(
exec
);
DLSYM
(
kill
);
DLSYM
(
kill
);
DLSYM
(
destroy
);
DLSYM
(
destroy
);
DLSYM
(
create_process
);
#undef DLSYM
#undef DLSYM
return
0
;
return
0
;
...
...
rune/libcontainer/nsenter/nsexec.c
浏览文件 @
f822dc13
...
@@ -570,7 +570,8 @@ void join_namespaces(char *nslist)
...
@@ -570,7 +570,8 @@ void join_namespaces(char *nslist)
extern
int
ensure_cloned_binary
(
void
);
extern
int
ensure_cloned_binary
(
void
);
/* Defined in loader.c. */
/* Defined in loader.c. */
extern
int
is_enclave
(
void
);
extern
bool
enclave_configured
(
void
);
extern
bool
is_init_runelet
(
void
);
extern
int
load_enclave_runtime
(
void
);
extern
int
load_enclave_runtime
(
void
);
void
nsexec
(
void
)
void
nsexec
(
void
)
...
@@ -579,7 +580,6 @@ void nsexec(void)
...
@@ -579,7 +580,6 @@ void nsexec(void)
jmp_buf
env
;
jmp_buf
env
;
int
sync_child_pipe
[
2
],
sync_grandchild_pipe
[
2
];
int
sync_child_pipe
[
2
],
sync_grandchild_pipe
[
2
];
struct
nlconfig_t
config
=
{
0
};
struct
nlconfig_t
config
=
{
0
};
char
*
rootfs
;
/*
/*
* Setup a pipe to send logs to the parent. This should happen
* Setup a pipe to send logs to the parent. This should happen
...
@@ -603,6 +603,12 @@ void nsexec(void)
...
@@ -603,6 +603,12 @@ void nsexec(void)
if
(
ensure_cloned_binary
()
<
0
)
if
(
ensure_cloned_binary
()
<
0
)
bail
(
"could not ensure we are a cloned binary"
);
bail
(
"could not ensure we are a cloned binary"
);
if
(
enclave_configured
())
{
int
ret
=
load_enclave_runtime
();
if
(
ret
<
0
)
bail
(
"load_enclave_runtime() failed, ret = %d"
,
ret
);
}
write_log
(
DEBUG
,
"nsexec started"
);
write_log
(
DEBUG
,
"nsexec started"
);
/* Parse all of the netlink configuration. */
/* Parse all of the netlink configuration. */
...
@@ -644,16 +650,6 @@ void nsexec(void)
...
@@ -644,16 +650,6 @@ void nsexec(void)
/* TODO: Currently we aren't dealing with child deaths properly. */
/* TODO: Currently we aren't dealing with child deaths properly. */
rootfs
=
getenv
(
"_LIBCONTAINER_PAL_ROOTFS"
);
if
(
rootfs
&&
*
rootfs
!=
'\0'
)
{
char
ld_path
[
PATH_MAX
+
1
];
snprintf
(
ld_path
,
sizeof
(
ld_path
)
-
1
,
"%s/usr/lib/x86_64-linux-gnu:%s/usr/lib:%s/usr/lib64:%s/lib:%s/lib64"
,
rootfs
,
rootfs
,
rootfs
,
rootfs
,
rootfs
);
setenv
(
"LD_LIBRARY_PATH"
,
ld_path
,
1
);
}
/*
/*
* Okay, so this is quite annoying.
* Okay, so this is quite annoying.
*
*
...
@@ -843,11 +839,6 @@ void nsexec(void)
...
@@ -843,11 +839,6 @@ void nsexec(void)
case
JUMP_CHILD
:{
case
JUMP_CHILD
:{
pid_t
child
;
pid_t
child
;
enum
sync_t
s
;
enum
sync_t
s
;
int
ret
;
ret
=
load_enclave_runtime
();
if
(
ret
<
0
)
bail
(
"load_enclave_runtime() failed, ret = %d"
,
ret
);
/* We're in a child and thus need to tell the parent if we die. */
/* We're in a child and thus need to tell the parent if we die. */
syncfd
=
sync_child_pipe
[
0
];
syncfd
=
sync_child_pipe
[
0
];
...
@@ -1040,8 +1031,17 @@ void nsexec(void)
...
@@ -1040,8 +1031,17 @@ void nsexec(void)
/* Free netlink data. */
/* Free netlink data. */
nl_free
(
&
config
);
nl_free
(
&
config
);
if
(
is_enclave
())
if
(
enclave_configured
())
{
prctl
(
PR_SET_NAME
,
(
unsigned
long
)
"init-runelet"
,
0
,
0
,
0
);
const
char
*
name
;
if
(
is_init_runelet
())
name
=
"init-runelet"
;
else
name
=
"runelet"
;
/* For debugging. */
prctl
(
PR_SET_NAME
,
(
unsigned
long
)
name
,
0
,
0
,
0
);
}
/* Finish executing, let the Go runtime take over. */
/* Finish executing, let the Go runtime take over. */
return
;
return
;
...
...
rune/libcontainer/process_linux.go
浏览文件 @
f822dc13
...
@@ -144,8 +144,6 @@ func (p *setnsProcess) start() (err error) {
...
@@ -144,8 +144,6 @@ func (p *setnsProcess) start() (err error) {
Type
:
p
.
config
.
Config
.
Enclave
.
Type
,
Type
:
p
.
config
.
Config
.
Enclave
.
Type
,
Path
:
p
.
config
.
Config
.
Enclave
.
Path
,
Path
:
p
.
config
.
Config
.
Enclave
.
Path
,
Args
:
p
.
config
.
Config
.
Enclave
.
Args
,
Args
:
p
.
config
.
Config
.
Enclave
.
Args
,
Signer
:
p
.
config
.
Config
.
Enclave
.
Signer
,
Cmd
:
p
.
process
.
Args
,
}
}
err
:=
utils
.
WriteJSON
(
p
.
messageSockPair
.
parent
,
config
)
err
:=
utils
.
WriteJSON
(
p
.
messageSockPair
.
parent
,
config
)
if
err
!=
nil
{
if
err
!=
nil
{
...
@@ -476,8 +474,6 @@ func (p *initProcess) start() (retErr error) {
...
@@ -476,8 +474,6 @@ func (p *initProcess) start() (retErr error) {
Type
:
p
.
config
.
Config
.
Enclave
.
Type
,
Type
:
p
.
config
.
Config
.
Enclave
.
Type
,
Path
:
p
.
config
.
Config
.
Enclave
.
Path
,
Path
:
p
.
config
.
Config
.
Enclave
.
Path
,
Args
:
p
.
config
.
Config
.
Enclave
.
Args
,
Args
:
p
.
config
.
Config
.
Enclave
.
Args
,
Signer
:
p
.
config
.
Config
.
Enclave
.
Signer
,
Cmd
:
p
.
config
.
Args
,
}
}
err
:=
utils
.
WriteJSON
(
p
.
messageSockPair
.
parent
,
config
)
err
:=
utils
.
WriteJSON
(
p
.
messageSockPair
.
parent
,
config
)
if
err
!=
nil
{
if
err
!=
nil
{
...
...
rune/libcontainer/setns_init_linux.go
浏览文件 @
f822dc13
...
@@ -7,7 +7,6 @@ import (
...
@@ -7,7 +7,6 @@ import (
"os"
"os"
"runtime"
"runtime"
"github.com/sirupsen/logrus"
"github.com/opencontainers/runc/libcontainer/apparmor"
"github.com/opencontainers/runc/libcontainer/apparmor"
"github.com/opencontainers/runc/libcontainer/keys"
"github.com/opencontainers/runc/libcontainer/keys"
"github.com/opencontainers/runc/libcontainer/seccomp"
"github.com/opencontainers/runc/libcontainer/seccomp"
...
@@ -15,6 +14,7 @@ import (
...
@@ -15,6 +14,7 @@ import (
"github.com/opencontainers/runc/libenclave"
"github.com/opencontainers/runc/libenclave"
"github.com/opencontainers/selinux/go-selinux/label"
"github.com/opencontainers/selinux/go-selinux/label"
"github.com/pkg/errors"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"golang.org/x/sys/unix"
"golang.org/x/sys/unix"
)
)
...
@@ -95,20 +95,24 @@ func (l *linuxSetnsInit) Init() error {
...
@@ -95,20 +95,24 @@ func (l *linuxSetnsInit) Init() error {
}
}
}
}
if
l
.
config
.
Config
.
Enclave
!=
nil
{
if
l
.
config
.
Config
.
Enclave
!=
nil
{
err
:=
libenclave
.
StartBootstrap
(
l
.
pipe
,
l
.
logPipe
,
l
.
logLevel
,
-
1
,
l
.
agentPipe
,
l
.
detached
)
cfg
:=
&
libenclave
.
RuneletConfig
{
if
err
!=
nil
{
InitPipe
:
l
.
pipe
,
return
newSystemErrorWithCause
(
err
,
"libenclave bootstrap"
)
LogPipe
:
l
.
logPipe
,
LogLevel
:
l
.
logLevel
,
FifoFd
:
-
1
,
AgentPipe
:
l
.
agentPipe
,
Detached
:
l
.
detached
,
}
}
exitCode
,
err
:=
libenclave
.
StartInitialization
()
exitCode
,
err
:=
libenclave
.
StartInitialization
(
l
.
config
.
Args
,
cfg
)
if
err
!=
nil
{
if
err
!=
nil
{
logrus
.
Fatal
(
err
)
logrus
.
Fatal
(
err
)
os
.
Exit
(
1
)
os
.
Exit
(
1
)
}
}
logrus
.
Debugf
(
"enclave
exitC
ode: %d"
,
exitCode
)
logrus
.
Debugf
(
"enclave
payload exit c
ode: %d"
,
exitCode
)
os
.
Exit
(
int
(
exitCode
))
os
.
Exit
(
int
(
exitCode
))
// make compiler happy
// make compiler happy
return
nil
return
fmt
.
Errorf
(
"failed to initialize runelet"
)
}
}
return
system
.
Execv
(
l
.
config
.
Args
[
0
],
l
.
config
.
Args
[
0
:
],
os
.
Environ
())
return
system
.
Execv
(
l
.
config
.
Args
[
0
],
l
.
config
.
Args
[
0
:
],
os
.
Environ
())
}
}
rune/libcontainer/specconv/spec_linux.go
浏览文件 @
f822dc13
...
@@ -331,17 +331,11 @@ func createEnclaveConfig(spec *specs.Spec, config *configs.Config) {
...
@@ -331,17 +331,11 @@ func createEnclaveConfig(spec *specs.Spec, config *configs.Config) {
args
=
strings
.
Join
(
a
,
" "
)
args
=
strings
.
Join
(
a
,
" "
)
}
}
signer
:=
filterOut
(
env
,
"ENCLAVE_RUNTIME_SIGNER"
)
if
signer
==
""
{
signer
=
libcontainerUtils
.
SearchLabels
(
config
.
Labels
,
"enclave.runtime.signer"
)
}
if
etype
!=
""
{
if
etype
!=
""
{
config
.
Enclave
=
&
configs
.
Enclave
{
config
.
Enclave
=
&
configs
.
Enclave
{
Type
:
etype
,
Type
:
etype
,
Path
:
path
,
Path
:
path
,
Args
:
args
,
Args
:
args
,
Signer
:
signer
,
}
}
}
}
}
}
...
...
rune/libcontainer/standard_init_linux.go
浏览文件 @
f822dc13
...
@@ -9,7 +9,6 @@ import (
...
@@ -9,7 +9,6 @@ import (
"runtime"
"runtime"
"syscall"
//only for Exec
"syscall"
//only for Exec
"github.com/sirupsen/logrus"
"github.com/opencontainers/runc/libcontainer/apparmor"
"github.com/opencontainers/runc/libcontainer/apparmor"
"github.com/opencontainers/runc/libcontainer/configs"
"github.com/opencontainers/runc/libcontainer/configs"
"github.com/opencontainers/runc/libcontainer/keys"
"github.com/opencontainers/runc/libcontainer/keys"
...
@@ -18,6 +17,7 @@ import (
...
@@ -18,6 +17,7 @@ import (
"github.com/opencontainers/runc/libenclave"
"github.com/opencontainers/runc/libenclave"
"github.com/opencontainers/selinux/go-selinux/label"
"github.com/opencontainers/selinux/go-selinux/label"
"github.com/pkg/errors"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"golang.org/x/sys/unix"
"golang.org/x/sys/unix"
)
)
...
@@ -180,11 +180,30 @@ func (l *linuxStandardInit) Init() error {
...
@@ -180,11 +180,30 @@ func (l *linuxStandardInit) Init() error {
return
unix
.
Kill
(
unix
.
Getpid
(),
unix
.
SIGKILL
)
return
unix
.
Kill
(
unix
.
Getpid
(),
unix
.
SIGKILL
)
}
}
if
l
.
config
.
Config
.
Enclave
!=
nil
{
if
l
.
config
.
Config
.
Enclave
!=
nil
{
err
:=
libenclave
.
StartBootstrap
(
l
.
pipe
,
l
.
logPipe
,
l
.
logLevel
,
l
.
fifoFd
,
l
.
agentPipe
,
l
.
detached
)
if
l
.
config
.
Config
.
Seccomp
!=
nil
&&
l
.
config
.
NoNewPrivileges
{
if
err
:=
seccomp
.
InitSeccomp
(
l
.
config
.
Config
.
Seccomp
);
err
!=
nil
{
return
newSystemErrorWithCause
(
err
,
"init seccomp"
)
}
}
cfg
:=
&
libenclave
.
RuneletConfig
{
InitPipe
:
l
.
pipe
,
LogPipe
:
l
.
logPipe
,
LogLevel
:
l
.
logLevel
,
FifoFd
:
l
.
fifoFd
,
AgentPipe
:
l
.
agentPipe
,
Detached
:
l
.
detached
,
}
exitCode
,
err
:=
libenclave
.
StartInitialization
(
l
.
config
.
Args
,
cfg
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
logrus
.
Fatal
(
err
)
os
.
Exit
(
1
)
}
}
return
l
.
finalizeInit
(
"/proc/self/exe"
,
[]
string
{
"init-runelet"
,
"enclave"
},
true
)
logrus
.
Debugf
(
"init enclave runtime exit code: %d"
,
exitCode
)
os
.
Exit
(
int
(
exitCode
))
// make compiler happy
return
fmt
.
Errorf
(
"failed to initialize init-runelet"
)
}
}
// Check for the arg before waiting to make sure it exists and it is
// Check for the arg before waiting to make sure it exists and it is
// returned as a create time error.
// returned as a create time error.
...
@@ -212,10 +231,6 @@ func (l *linuxStandardInit) Init() error {
...
@@ -212,10 +231,6 @@ func (l *linuxStandardInit) Init() error {
// since been resolved.
// since been resolved.
// https://github.com/torvalds/linux/blob/v4.9/fs/exec.c#L1290-L1318
// https://github.com/torvalds/linux/blob/v4.9/fs/exec.c#L1290-L1318
unix
.
Close
(
l
.
fifoFd
)
unix
.
Close
(
l
.
fifoFd
)
return
l
.
finalizeInit
(
name
,
l
.
config
.
Args
[
0
:
],
false
)
}
func
(
l
*
linuxStandardInit
)
finalizeInit
(
entryName
string
,
args
[]
string
,
noexec
bool
)
error
{
// Set seccomp as close to execve as possible, so as few syscalls take
// Set seccomp as close to execve as possible, so as few syscalls take
// place afterward (reducing the amount of syscalls that users need to
// place afterward (reducing the amount of syscalls that users need to
// enable in their seccomp profiles).
// enable in their seccomp profiles).
...
@@ -224,18 +239,8 @@ func (l *linuxStandardInit) finalizeInit(entryName string, args []string, noexec
...
@@ -224,18 +239,8 @@ func (l *linuxStandardInit) finalizeInit(entryName string, args []string, noexec
return
newSystemErrorWithCause
(
err
,
"init seccomp"
)
return
newSystemErrorWithCause
(
err
,
"init seccomp"
)
}
}
}
}
if
noexec
{
if
err
:=
syscall
.
Exec
(
name
,
l
.
config
.
Args
[
0
:
],
os
.
Environ
());
err
!=
nil
{
exitCode
,
err
:=
libenclave
.
StartInitialization
()
return
newSystemErrorWithCause
(
err
,
"exec user process"
)
if
err
!=
nil
{
logrus
.
Fatal
(
err
)
os
.
Exit
(
1
)
}
logrus
.
Debugf
(
"enclave exitCode: %d"
,
exitCode
)
os
.
Exit
(
int
(
exitCode
))
}
else
{
if
err
:=
syscall
.
Exec
(
entryName
,
args
,
os
.
Environ
());
err
!=
nil
{
return
newSystemErrorWithCause
(
err
,
"exec user process"
)
}
}
}
return
nil
return
err
}
}
rune/libenclave/bootstrap.go
已删除
100644 → 0
浏览文件 @
9777f5ca
package
libenclave
// import "github.com/opencontainers/runc/libenclave"
import
(
"github.com/sirupsen/logrus"
"os"
)
type
enclaveRuntimeEnv
struct
{
initPipe
*
os
.
File
logPipe
*
os
.
File
logLevel
string
fifoFd
int
agentPipe
*
os
.
File
detached
bool
}
var
enclaveEnv
enclaveRuntimeEnv
func
GetEnclaveRunetimeEnv
()
*
enclaveRuntimeEnv
{
return
&
enclaveEnv
}
// `rune init` needs to execute self (/proc/self/exe) in container environment
// as `runc init` executes entrypoint. Thus, some internal states in form of
// environment variable must be staged and then recovered after re-exec. This
// process is so called as libenclave bootstrapping, and the resulting process
// is so called as runelet.
func
StartBootstrap
(
initPipe
*
os
.
File
,
logPipe
*
os
.
File
,
logLevel
string
,
fifoFd
int
,
agentPipe
*
os
.
File
,
detached
bool
)
(
err
error
)
{
logrus
.
Debug
(
"bootstrapping libenclave ..."
)
enclaveEnv
.
initPipe
=
initPipe
enclaveEnv
.
logPipe
=
logPipe
enclaveEnv
.
logLevel
=
logLevel
enclaveEnv
.
fifoFd
=
fifoFd
enclaveEnv
.
agentPipe
=
agentPipe
enclaveEnv
.
detached
=
detached
return
nil
}
rune/libenclave/configs/config.go
浏览文件 @
f822dc13
...
@@ -4,6 +4,4 @@ type InitEnclaveConfig struct {
...
@@ -4,6 +4,4 @@ type InitEnclaveConfig struct {
Type
string
`json:"type"`
Type
string
`json:"type"`
Path
string
`json:"path"`
Path
string
`json:"path"`
Args
string
`json:"args"`
Args
string
`json:"args"`
Signer
string
`json:"signer"`
Cmd
[]
string
`json:"cmd"`
}
}
rune/libenclave/internal/runtime/enclave_runtime.go
浏览文件 @
f822dc13
...
@@ -7,6 +7,7 @@ import (
...
@@ -7,6 +7,7 @@ import (
"github.com/sirupsen/logrus"
"github.com/sirupsen/logrus"
"os"
"os"
"os/exec"
"os/exec"
"strings"
)
)
type
EnclaveRuntime
interface
{
type
EnclaveRuntime
interface
{
...
@@ -62,7 +63,7 @@ func (rt *EnclaveRuntimeWrapper) LaunchAttestation() error {
...
@@ -62,7 +63,7 @@ func (rt *EnclaveRuntimeWrapper) LaunchAttestation() error {
}
}
func
(
rt
*
EnclaveRuntimeWrapper
)
ExecutePayload
(
cmd
[]
string
,
envp
[]
string
,
stdio
[
3
]
*
os
.
File
)
(
int32
,
error
)
{
func
(
rt
*
EnclaveRuntimeWrapper
)
ExecutePayload
(
cmd
[]
string
,
envp
[]
string
,
stdio
[
3
]
*
os
.
File
)
(
int32
,
error
)
{
logrus
.
Debugf
(
"enclave runtime %s executing payload with commandline"
,
cmd
)
logrus
.
Debugf
(
"enclave runtime %s executing payload with commandline"
,
strings
.
Join
(
cmd
,
" "
)
)
// The executable may not exist in container at all according
// The executable may not exist in container at all according
// to the design of enclave runtime, such as Occlum, which uses
// to the design of enclave runtime, such as Occlum, which uses
...
...
rune/libenclave/runelet.go
浏览文件 @
f822dc13
...
@@ -21,17 +21,24 @@ const signalBufferSize = 2048
...
@@ -21,17 +21,24 @@ const signalBufferSize = 2048
var
enclaveRuntime
*
runtime
.
EnclaveRuntimeWrapper
var
enclaveRuntime
*
runtime
.
EnclaveRuntimeWrapper
func
StartInitialization
()
(
exitCode
int32
,
err
error
)
{
type
RuneletConfig
struct
{
env
:=
GetEnclaveRunetimeEnv
()
InitPipe
*
os
.
File
LogPipe
*
os
.
File
LogLevel
string
FifoFd
int
AgentPipe
*
os
.
File
Detached
bool
}
logLevel
:=
env
.
logLevel
func
StartInitialization
(
cmd
[]
string
,
cfg
*
RuneletConfig
)
(
exitCode
int32
,
err
error
)
{
logLevel
:=
cfg
.
LogLevel
// Determine which type of runelet is initializing.
// Determine which type of runelet is initializing.
fifoFd
:=
env
.
f
ifoFd
fifoFd
:=
cfg
.
F
ifoFd
// Retrieve the init pipe fd to accomplish the enclave configuration
// Retrieve the init pipe fd to accomplish the enclave configuration
// handshake as soon as possible with parent rune.
// handshake as soon as possible with parent rune.
initPipe
:=
env
.
i
nitPipe
initPipe
:=
cfg
.
I
nitPipe
defer
func
()
{
defer
func
()
{
if
err
!=
nil
{
if
err
!=
nil
{
initPipe
.
Close
()
initPipe
.
Close
()
...
@@ -70,7 +77,7 @@ func StartInitialization() (exitCode int32, err error) {
...
@@ -70,7 +77,7 @@ func StartInitialization() (exitCode int32, err error) {
}
}
// If runelet run as detach mode, close logrus before initpipe closed.
// If runelet run as detach mode, close logrus before initpipe closed.
if
env
.
d
etached
{
if
cfg
.
D
etached
{
logrus
.
SetOutput
(
ioutil
.
Discard
)
logrus
.
SetOutput
(
ioutil
.
Discard
)
}
}
...
@@ -84,13 +91,13 @@ func StartInitialization() (exitCode int32, err error) {
...
@@ -84,13 +91,13 @@ func StartInitialization() (exitCode int32, err error) {
// and entrypoint, implying `rune exec` may preempt them too.
// and entrypoint, implying `rune exec` may preempt them too.
// Launch agent service for child runelet.
// Launch agent service for child runelet.
agentPipe
:=
env
.
a
gentPipe
agentPipe
:=
cfg
.
A
gentPipe
defer
agentPipe
.
Close
()
defer
agentPipe
.
Close
()
notifySignal
:=
make
(
chan
os
.
Signal
,
signalBufferSize
)
notifySignal
:=
make
(
chan
os
.
Signal
,
signalBufferSize
)
if
fifoFd
==
-
1
{
if
fifoFd
==
-
1
{
exitCode
,
err
=
remoteExec
(
agentPipe
,
c
onfig
,
notifySignal
)
exitCode
,
err
=
remoteExec
(
agentPipe
,
c
md
,
notifySignal
)
if
err
!=
nil
{
if
err
!=
nil
{
return
exitCode
,
err
return
exitCode
,
err
}
}
...
@@ -116,7 +123,7 @@ func StartInitialization() (exitCode int32, err error) {
...
@@ -116,7 +123,7 @@ func StartInitialization() (exitCode int32, err error) {
// have a way to prevent from this race happening.
// have a way to prevent from this race happening.
enclaveRuntime
=
rt
enclaveRuntime
=
rt
exitCode
,
err
=
rt
.
ExecutePayload
(
c
onfig
.
C
md
,
os
.
Environ
(),
exitCode
,
err
=
rt
.
ExecutePayload
(
cmd
,
os
.
Environ
(),
[
3
]
*
os
.
File
{
[
3
]
*
os
.
File
{
os
.
Stdin
,
os
.
Stdout
,
os
.
Stderr
,
os
.
Stdin
,
os
.
Stdout
,
os
.
Stderr
,
})
})
...
@@ -191,12 +198,13 @@ func finalizeInitialization(fifoFd int) error {
...
@@ -191,12 +198,13 @@ func finalizeInitialization(fifoFd int) error {
return
nil
return
nil
}
}
func
remoteExec
(
agentPipe
*
os
.
File
,
config
*
configs
.
InitEnclaveConfig
,
notifySignal
chan
os
.
Signal
)
(
exitCode
int32
,
err
error
)
{
func
remoteExec
(
agentPipe
*
os
.
File
,
cmd
[]
string
,
notifySignal
chan
os
.
Signal
)
(
exitCode
int32
,
err
error
)
{
logrus
.
Debugf
(
"preparing to remote exec %s"
,
strings
.
Join
(
config
.
Cmd
,
" "
))
c
:=
strings
.
Join
(
cmd
,
" "
)
logrus
.
Debugf
(
"preparing to remote exec %s"
,
c
)
req
:=
&
pb
.
AgentServiceRequest
{}
req
:=
&
pb
.
AgentServiceRequest
{}
req
.
Exec
=
&
pb
.
AgentServiceRequest_Execute
{
req
.
Exec
=
&
pb
.
AgentServiceRequest_Execute
{
Argv
:
strings
.
Join
(
config
.
Cmd
,
" "
)
,
Argv
:
c
,
Envp
:
strings
.
Join
(
os
.
Environ
(),
" "
),
Envp
:
strings
.
Join
(
os
.
Environ
(),
" "
),
}
}
if
err
=
protoBufWrite
(
agentPipe
,
req
);
err
!=
nil
{
if
err
=
protoBufWrite
(
agentPipe
,
req
);
err
!=
nil
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录