SFTP 서비스를 이용해 S3에 데이터를 넣고 관리하고자 한다.
접근 로그는 cloud watch log에 남겨야 한다.
보안상 사용자별 S3 사용 범위를 최소화 해야한다
<1> SFTP 서비스 구성
sftp client (linux, Mac,windows) -------- sftp 서비스 --- s3
<2> 작업 순서 요약
1. 테스트 리눅스 서버 1대 생성 (sftp-client , MAC PC면 만들 필요는 없다)
2. S3 버킷 생성 : s3-sftp-900 (디폴트로 생성, not public)
3. 계정으로 접속했을때 S3에 접근할수 있는 policy와 role 생성
policy 생성 : s3-sftp-access900
role 생성 : s3-sftp-accss900-role
Trust relationships 수정
4. SFTP 만들때, Cloudwatch log에 로그 남기기 위해 role 생성 - cloudwatchlog-sftp900-role
5. SFTP 서버 생성
- Logging role 지정 : cloudwatchlog-sftp900-role
Cloudwatch log에 접속로그 남기기.
6. SFTP 계정 900 생성
s3-sftp-access900-role , Home : s3-sftp-900 ,900, public 키 생성 ssh-keygen -P "" -f 900-key
7. 900계정으로 sftp 접속 테스트
[root@ip-10-0-0-108 ~]# sftp -i key900 900@s-bf1b2b4c71f64b17b.server.transfer.ap-northeast-2.amazonaws.com
<권한 제한하기>
8. s3범위 사용 축소를 위해 policy생성과 SFTP 사용자별 적용
축소범위가 기본 정책보다 우선 적용된다.
SFTP 각 계정에 Policy 적용
9. 테스트
# sftp -i 900-key
900@s-8f9ceb35f6894f339.server.transfer.ap-northeast-2.amazonaws.com
<2> 구축하기
1. 테스트 리눅스 서버 1대 생성 (sftp-client , MAC PC면 만들 필요는 없다)
2. S3 버킷 생성 : s3-sftp-900 (디폴트로 생성, not public)
3. 계정으로 접속했을때 S3에 접근할수 있는 policy와 role 생성
IAM Poilicy > Create > Visual editor로 생성 > s3 > ListBucket > bucket이름
policy 생성 : s3-sftp-access900
role 생성 : s3-sftp-accss900-role
Trust relationships 수정
S3버킷 읽는 policy와 role
policy
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:PutObject", // put 오브젝트
"s3:GetObject", // get 오브젝트
"s3:ListBucket", // List 버킷
"s3:DeleteObject" // delete 오브젝트
],
"Resource": [
"arn:aws:s3:::s3-sftp-access-900", // 버킷
"arn:aws:s3:::s3-sftp-access-900/*"
]
}
]
}
Roles
s3-sftp-access900
attatch s3-sftp-access900
s3-sftp-access900-role
Edit Trust Relationship
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "transfer.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
4. SFTP 만들때, Cloudwatch log에 로그 남기기 위해 role 생성 - cloudwatchlog-sftp900-role
cloudwatch에 로그를 남길수 있는 role 생성 (접속 로그를 남기진 않으면 생성하지 않아도 됨)
IAM > Create role > EC2 > CloudWatchLogsRWAccess
cloudwatchlog-sftp900-role
Trust relationship 추가.
Edit Trust Relationship
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "transfer.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
5. SFTP 생성
- Logging role : cloudwatch-sftp900-role
6. SFTP Users 900 생성.
SFTP > Add user > 900 > s3-sftp-access900-role > Home : s3-sftp-900 , 900, public 키 생성
public 키 생성을 위해 Ec2서버에 로그인.
ssh-keygen -P "" -f key900
[root@ip-10-0-0-108 ~]# ls
key900 key900.pub
[root@ip-10-0-0-108 ~]# more key900.pub
Notepad에서 키 연결해서 sftp public키 등록.
7. 900계정으로 sftp 접속 테스트
[root@ip-10-0-0-108 ~]# sftp -i key900 900@s-bf1b2b4c71f64b17b.server.transfer.ap-northeast-2.amazonaws.com
sftp> put 1
Uploading 1 to /s3-sftp-900/900/1 100% 0 0.0KB/s 00:00
sftp> ls
1
Cloudwatch log 도 확인.
<사용 범위 축소 하기 >
8. s3범위 사용 축소를 위해 policy생성과 SFTP 사용자별 적용
축소범위가 기본 정책보다 우선 적용된다.
SFTP 사용자별 범위 축소지정
1 ) policy 는 sftp - down900- policy
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowListingOfUserFolder",
"Action": [
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::${transfer:HomeBucket}"
],
"Condition": {
"StringLike": {
"s3:prefix": [
"${transfer:HomeFolder}/*",
"${transfer:HomeFolder}"
]
}
}
},
{
"Sid": "HomeDirObjectAccess",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObjectVersion",
"s3:DeleteObject",
"s3:GetObjectVersion",
"s3:GetObjectACL",
"s3:PutObjectACL"
],
"Resource": "arn:aws:s3:::${transfer:HomeDirectory}*"
}
]
}
2) SFTP 각 계정에 Policy 적용
SFTP > Servers > sftp server > 계정 900 > Edit > Policy > Selete policy from IAM > 적용
참고
9. 테스트
# sftp -i 900-key
900@s-8f9ceb35f6894f339.server.transfer.ap-northeast-2.amazonaws.com
sftp> ls
1 2 3
sftp> pwd
Remote working directory: /s3-sftp-900/900
sftp> cd ..
sftp> ls
Couldn't read directory: Permission denied
다른 디렉토리에 접근 못하도록 제한 되었다 !!!
sftp> pwd
Remote working directory: /s3-sftp-900
sftp> cd 900
별첨1 . winscp로 테스트
sftp client 로 접속 하기.
sftp client download
ssh-keygen으로 만든 private key 900을 putty-keygen으로 900.ppk private key를 만들어 접속한다
또는
Winscp에서 900키를 열면 900.ppk로 변환된다.
접속한다.
감사합니다.