2013년 2월 26일 화요일

7일차- 배열2

public class CarFactoryMain {


public static void main(String[] args) {

Car matiz = new Car();
matiz.setModel("matiz");
matiz.setDoorCount(4);

Engine mEngine = new Engine();
mEngine.setType("A");
mEngine.setCc(1000);
matiz.setEngine(mEngine);

matiz.print();

}

}
----------------------------------------------------

public class Car {

private String model;
private int doorCount;
/****engine****/
private Engine engine;
/**************/

public void setData(String model, int doorCount, Engine engine){
this.model=model;
this.doorCount=doorCount;
this.engine=engine;
}
public void print(){
System.out.println("모델:"+this.model);
System.out.println("문수:"+this.doorCount);
/*
System.out.println("엔진타입:"+this.engine.getType());
System.out.println("엔진배기량:"+this.engine.getCc());
*/
engine.print();
}
/*
public String getInfo(){
return ""+model+"\t"+doorCount+"\t"+"engine";
}
*/
public void setEngine(Engine engine)  {
this.engine=engine;
}
public Engine getEngine()  {
return this.engine;
}
public String getModel() {
return model;
}

public void setModel(String model) {
this.model = model;
}

public int getDoorCount() {
return doorCount;
}

public void setDoorCount(int doorCount) {
this.doorCount = doorCount;
}
}
--------------------------------------------------------
public class Engine {

private String type;//엔진의 타입
private int cc;  //엔진의 배기량
public void print(){
System.out.println(this.type);
System.out.println(this.cc);
/*
* String getInfo = this.getInfo();
*
*System.out.println(getInfo);
*/
}
/*
public String getInfo()  {
return type+"\t"+cc;
}
*/
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public int getCc() {
return cc;
}
public void setCc(int cc) {
this.cc = cc;
}
}

7일차- 배열2


//2. 1차원 객체(참조)형배열

Photo p0=new Photo();
p0.setData(1, "부산에서", "bs.jpg", "2013-02-02");
p0.print();

Photo p1,p2,p3,p4,p5;

p1 = new Photo();
p1.setData(2, "대구1", "bs1.jpg", "2013-02-02");

p2 = new Photo();
p2.setData(3, "대구2", "bs2.jpg", "2013-02-02");

p3 = new Photo();
p3.setData(4, "대구3", "bs3.jpg", "2013-02-02");

p4 = new Photo();
p4.setData(5, "대구4", "bs4.jpg", "2013-02-02");

p5 = new Photo();
p5.setData(6, "대구5", "bs5.jpg", "2013-02-02");



Photo[] photoArray ;
photoArray = new Photo[7];

photoArray[0] = p0;
photoArray[1] = p1;
photoArray[2] = p2;
photoArray[3] = p3;
photoArray[4] = p4;
photoArray[5] = p5;
photoArray[6] = new Photo();
photoArray[7].setData(7, "안면도에서...", "jj.jpg", "2012-08-12");
photoArray[0].print();
p1.print();
System.out.println("**********전체출력**********");
for (int j = 0; j < photoArray.length; j++) {

photoArray[j].print();
}

}


}
-------------------------------------------------------------------
/*
 * 사진 1개의 데이타를 저장할 객체
 */
public class Photo {
private int no; //번호
private String title; //제목
private String fileName; //파일 이름
private String date; //찍은 날짜

public void setData(int no,String title,String fileName,String date){
setNo(no);
setTitle(title);
setFileName(fileName);
setDate(date);

}
/*
* 사진정보 출력
*/
public void print(){
String info = this.getInFo();
System.out.println(info);
}
/*
* 객체 멤버 내용을 문자열로 반환
*/
public String getInFo(){
String info=no+"\t"+title+"\t"+fileName+"\t"+date ;
return info;

}

public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}

}
------------------------------------------------------------
public class CarArrayMain {

public static void main(String[] args) {
Car temp1 = new Car();
temp1.setData("4567", 5, 0, 0);
Car temp2 = new Car();
temp1.setData("2344", 5, 0, 0);
Car temp3 = new Car();
temp1.setData("6677", 5, 0, 0);
Car temp4 = new Car();
temp1.setData("1111", 5, 0, 0);
Car[] carArray = {  
temp1,null,null,null,null,
null,temp2,null,null,null,
null,null,temp3,null,null,
null,null,null,temp4,null,
null,null,null,null,null,
null,null,null,null,null,
 };
//입차
System.out.println("1.입차---------");
Car c1 = new Car();
c1.setData("1234", 10, 0, 0);
for (int i = 0; i < carArray.length; i++) {
if(carArray[i]==null){
carArray[i]=c1;
carArray[i].print();
break;
}
}
//총주차대수
int count=0;
for (int i = 0; i < carArray.length; i++) {
if(carArray[i]!=null){
count++;
}
}
System.out.println("2.현재 총 주차대수:"+count);
//현재차량의 15시현재 총주차요금
int tot=0;
for (int i = 0; i < carArray.length; i++) {
if(carArray[i]!=null){
carArray[i].setOutTime(15);
carArray[i].calculateFee();
tot=tot+ carArray[i].getFee();
carArray[i].setOutTime(0);
carArray[i].setFee(0);
}
}
System.out.println("3.현재차량의 15시현재 총주차요금:"+tot);
//9시 이후 입차 차량 찾기
System.out.println("4.9시 이후 입차차량 찾기");
for (int i = 0; i < carArray.length; i++) {
if(carArray[i]!=null){
if(carArray[i].getInTime()>=9){
carArray[i].print();
}
}
}
//1234 번 차량 출차(1234번차 차량찾기-->출차)
System.out.println("5.1234 번 차량 출차17시");
for (int i = 0; i < carArray.length; i++) {
String tempNo=carArray[i].getNo();
if(tempNo.equals("1234")){
carArray[i].setOutTime(17);
carArray[i].calculateFee();
carArray[i].print();
carArray[i]=null;
break;
}
}
//총주차대수
count=0;
for (int i = 0; i < carArray.length; i++) {
if(carArray[i]!=null){
count++;
}
}
System.out.println("6.현재총주차대수:"+count);
}

}
------------------------------------------------------
String 문자열 비교
public class StringCompare {

/*
* 문자열객체비교
*/
public static void main(String[] args) {
String str1 ="김경호";
String str2 ="김경호";
String str3 =new String("김경호");
System.out.println("str1="+str1);
System.out.println("str2="+str2);
System.out.println("str3="+str3);
if(str1==str2){
System.out.println("같다");
}
if(str1==str3){
System.out.println("같다용");
}else if(str1!=str3){
System.out.println("다르다용");
}
/*
* <<String class>>
* public boolean equals(string anotherString);
* -문자열이 일치하는지 비교
* -리턴값 true: 문자열 일치 , false: 문자열불일치
*
*/
boolean isSame = str1.equals(str3);
isSame = str1.equals(str3);
isSame = str1.equals("김경호");
}

}


2013년 2월 25일 월요일

6일차 숙제

1~45까지의 정수를 랜덤하게 6개 발생
(숫자가 중복되면 안됨=>배열 / 랜덤 / 사용)

-----------------------------------------------


1. 6개의 랜덤 수 생성.

 - 6개의 숫자를 랜덤으로 뽑아낼 반복 구문 사용 =>random 사용

 - 그 숫자는 1~ 45 사이에 정수여야함

 - 배열 사용해서 6번 발생 - > array사용



2. 중복 될수 없다.

 - 중복된 수만큼 더 실행..
   어떻게 중복 확인..ㅡㅡ.....

public class Lotto { public static void main(String[] args){ int[] ct ; ct = new int[6]; for(int j=0 ;j<ct.length;j++){ for(int i=0; i<ct.length ; i++){ int ct1= 0; ct1= (int)((Math.random()*45)); System.out.print(ct1+"\t"); } System.out.println(); } } }

6일차 - 랜덤 // array


public class RnadomMain {


public static void main(String[] args) {
/*
* Returns a double value with a positive sign, greater than or
* equal to 0.0 and less than 1.0.
*/
double d = Math.random();
System.out.println(d);
d=Math.random();
System.out.println(d);

System.out.println("****1~10까지의 정수 random하게 받기****");

for(int i=0;i<10;i++){
System.out.print((int)(Math.random()*10)+1+"\t");
}
System.out.println("****1~45까지의 정수를 random하게 발생****");
/*
* 1. 1~45까지의 정수를 랜덤하게 발생(6개숫자)
* 2. 중복되면 안됨
*
*/





}

}
---------------------------------------------------------------/*
 배열:  
      - 같은데이타형을 가진 기억장소여러개의 모음 
      - 배열변수의 선언형식
           데이타타입[] 이름; 
 - 사용: 
      1.배열객체의생성(디폴트값초기화)
  2.배열객체의 구성요서들의 값 대입
      -특징   
 1.모든 배열형의 변수는 참조변수이다.
   (배열은 객체다.)
 2.같은타입만 정의가가능하다 
 3.길이가 고정되어있다. 
 
 */
public class ArrayMain {

public static void main(String[] args) {
//1차원 기본형배열 
//int i;
//i = 0 ;
//A.int배열 변수선언
int[] iArray;
//B.int배열 객체생성
iArray = new int[5];
iArray[0] = 1;
iArray[1] = 2;
iArray[2] = 3;
iArray[3] = 4;
iArray[4] = 5;
System.out.println("iArray="+iArray);
System.out.println("iArray.length==>"+iArray.length);
for(int i = 0 ; i<iArray.length ; i++){
System.out.println("iArray["+i+"]="+iArray[i]);
}
char[] cArray=new char[10];
//초기값
for (int i = 0; i < cArray.length; i++) {
cArray[i] = (char)(65+i);
}
//출력
for (int i = 0; i < cArray.length; i++) {
System.out.println("cArray["+i+"]"+cArray[i]);
}
System.out.println("********boolean[]*************");
boolean[] bArray=new boolean[5];
for(int i=0; i <bArray.length; i++){
System.out.println("bArray["+i+"]="+bArray[i]);
}
System.out.println("********String[]*************");
String[] strArray=new String[3];
for(int i=0; i <strArray.length; i++){
System.out.println("strArray["+i+"]="+strArray[i]);
}
strArray[0]="안드로이드반";
strArray[1]="회식함 ";
strArray[2]="해야되는데~~~";
for(int i=0; i <strArray.length; i++){
System.out.print(strArray[i]);
}
System.out.println();
System.out.println("********배열의 초기화*************");
int[] intArray={0,1,2,3,4};
char[] charArray={'김','경','호','제','임','스'};
boolean[] booleanArray={true,false,true,true};
String[] stringArray={"자바를","자바바","!!!!"};
//출력하세요
for(int i=0; i <intArray.length; i++){
System.out.println("intArray["+i+"]="+intArray[i]);
}
for(int i=0; i <charArray.length; i++){
System.out.println("charArray["+i+"]="+charArray[i]);
}
for(int i=0; i <booleanArray.length; i++){
System.out.println("booleanArray["+i+"]="+booleanArray[i]);
}
for(int i=0; i <stringArray.length; i++){
System.out.println("stringArray["+i+"]="+stringArray[i]);
}
}

}

6일차- overloading/객체비교


public class OverloadingMain {


public static void main(String[] args) {
Overloading o1 = new Overloading();
o1.method();
o1.method(123);
o1.method(123,456);
o1.method('A');
o1.method('A','B');


}

}
----------------------------------------------------

/*
오버로딩(메쏘드의 다중정의)
  1. 자바 다형성구현기법 중의하나이다.
  2. 정의: 같은메쏘드 이름으로 여러개의 메쏘드를 정의하는방법
           - 규칙:
               * 메쏘드의 이름이 같아야한다.
               * 메쏘드의 인자의 숫자가 다르거나
               * 메쏘드의 인자의 타입이 달라야한다.
               * 메쏘드의 리턴타입,접근지정자는 상관없다.

*/
public class Overloading {
public void method(){
System.out.println("public void methood()");
}

//인자의 수
public void method(int a){
System.out.println("public void methood(int a)");
}
public void method(int a,int b){
System.out.println("public void methood(int a, int b)");
}

//인자의 타입
public void method(char a){
System.out.println("public void methood(char a)");
}
public void method(char a,char b){
System.out.println("public void methood(char a, char b)");
}
/*
//메쏘드 리턴타입(x)

public int method1(){
return 0;
}
public boolean method1(){
return true;
}
*/
public static void main(String[] args) {
Overloading o1 = new Overloading();
o1.method();
o1.method(123);
o1.method(123,456);
o1.method('A');
o1.method('A','B');


}
}
-----------------------------------------------------

/*
 * 객체비교
 */
public class ObjectCompare {


public static void main(String[] args) {
//기본형비교

int a=10;
char c='A';
boolean b = true;

if(a>0){
System.out.println(a+" > 0");
}else if(a<0){
System.out.println(a+" < 0");
}else if(a==0){
System.out.println(a+" = 0");
}
if(c>20){
System.out.println(c+" > 20");
}

if(b==true){
System.out.println(b+" = true");
}
//객체형비교(같은 타입의 객체형끼리만 가능)
Member member1 = new Member();
member1.setNo(1);
member1.setName("LEE");
member1.setAge(34);
member1.setAddress("화성인");

Member member2 = new Member();
member2.setNo(2);
member2.setName("PARK");
member2.setAge(43);
member2.setAddress("목성인");

if(member1==member2){
System.out.println("member1주소==member2주소");
}else if(member1!=member2){
System.out.println("member1주소!=member2주소");
}

Member member3 = member1 ;

if(member3==member1){
System.out.println("member3주소와 member1주소는 같다");
System.out.println("member3와 member1은 같은 객체를 참조한다");
}

/*
* 상수
* -정수형상수: 1, 2, 3
* -실수형상수: 23.45, 3,14
* -문자형상수: '김', 'A'
* -논리형상수: true, false
*
* -객체형상수: null,
* *null : 주소없다
*/

/*
* 모든 로칼변수는 초기화하여야한다.
*/
Member member4 = null;

if(member4 == null){
member4=member2;
member4.print();
}else if(member4!=null){
member4.print();
}
/*
* 모든멤버객체는 메모리수집의 대상이되며 사용불가능
*/
member1=null;
member2=null;
member3=null;
member4=null;








}

}


6일차 -encapsulation

public class Encapsulation {
/* OOP 의 원칙
 *   1. 캡슐화
 *   2. 상속성
 *   3. 다형성(오버로딩,오바라이딩,객체형변환)
 */

/*
 * 1. 캡슐화
 *    - 외부클래스에서 멤버변수에 접근을 막고
 *      멤버 메쏘드에만 접근할수있도록 클래스를 설계하는방법
 *    - 구현 : 멤버변수 의 접근제한자를 private 멤버변수의
 *             접근제한자는 public 으로한다.
 *             public ==> 어떤 외부클래스에서든지 접근가능
 *             private==> 어떤 외부클래스에서든지 접근불가능
 */
}
--------------------------------------------------------

/*
 * -은행의 계좌객체를 추상화한 클래스이다
 * -은행계좌의 데이타를 가지고 있는 클래스이다
 *
 */
public class Account {
private String no;//계좌번호
private String owner;//계좌주
private int balance;//잔고
private float iyul;//이율

/*
* 입금하다
*/
public void ipGum(int money){
this.balance= this.balance + money;
}
/*
* 출금하다
*/
public boolean chulGum(int money){

boolean isSuccess=false;

this.balance= this.balance - money;
if(this.balance<0){
this.balance=this.balance+money;
isSuccess=false;
}else{
isSuccess=false;
}
return isSuccess;
}
/*
* 계좌정보 출력하다
*/
public void print(){
System.out.println("계좌번호"+this.no);
System.out.println("계좌이름"+this.owner);
System.out.println("계좌잔고"+this.balance);
System.out.println("계좌이율"+this.iyul);

}
//setter
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
public String getOwner() {
return owner;
}
public void setOwner(String owner) {
this.owner = owner;
}
public int getBalance() {
return balance;
}
public void setBalance(int balance) {
this.balance = balance;
}
public float getIyul() {
return iyul;
}
public void setIyul(float iyul) {
this.iyul = iyul;
}


}
---------------------------------------------------


public class AccountMain {

public static void main(String[] args) {

Account acc1= new Account();

/*
acc1.no="1111";
acc1.owner="나님";
acc1.balance=5000;
//입금
//acc1.balance = acc1.balance+3000;
*/
acc1.setNo("1111");
acc1.setOwner("나님");
acc1.setBalance(5000);
acc1.setIyul(3.4f);
//입금
//acc1.balance = acc1.balance+3000;
acc1.ipGum(3000);
//출금
boolean isSuccess=acc1.chulGum(12000);
if(isSuccess){
System.out.println("출금성공:잔고"+acc1.getBalance());
}else{
System.out.println("출금실패:잔고"+acc1.getBalance());
}
//출력
acc1.print();
}

}



selinux 010

SE리눅스 상태를 알아 본다.
root@cooler-desktop:~# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   permissive
Mode from config file:          permissive
Policy version:                 24
Policy from config file:        ubuntu

1 1 첫번째는 현재 상태 1(true), 두번째는 펜딩 상태. 커밋이 되면 현재 상태에 적용될 것.
cat allow_execmod
1 1root@cooler-desktop:/selinux/booleans#

요런 sebool 값들이 있다.
root@cooler-desktop:/selinux/booleans# ls
allow_execheap            allow_user_postgresql_connect  nfs_export_all_rw       user_dmesg
allow_execmem             allow_write_xshm               secure_mode             user_ping
allow_execmod             allow_ypbind                   secure_mode_insmod      user_rw_noexattrfile
allow_execstack           cron_can_relabel               secure_mode_policyload  user_tcp_server
allow_mount_anyfile       fcron_crond                    ssh_sysadm_login        user_ttyfile_stat
allow_polyinstantiation   global_ssp                     use_lpd_server          xdm_sysadm_login
allow_ptrace              init_upstart                   use_nfs_home_dirs       xserver_object_manager
allow_ssh_keysign         mail_read_content              use_samba_home_dirs
allow_user_mysql_connect  nfs_export_all_ro              user_direct_mouse

명령어 사용법
root@cooler-desktop:/selinux/booleans# getsebool global_ssp
global_ssp --> off

root@cooler-desktop:/selinux/booleans# setsebool global_ssp 1
root@cooler-desktop:/selinux/booleans# !get
getsebool global_ssp
global_ssp --> on

요렇게 on/off 가능함.
1 1root@cooler-desktop:/selinux/booleans# echo 0 > global_ssp
root@cooler-desktop:/selinux/booleans# !cat
cat global_ssp
1 0root@cooler-desktop:/selinux/booleans# cat global_ssp
요러게 펜딩 값을 세팅 가능함. 커밋하면 적용되는데

커밋은
root@cooler-desktop:/selinux# ls -al commit_pending_bools
--w-------. 1 root root 0 Jan 27 16:57 commit_pending_bools
요놈이 한다.

root@cooler-desktop:/selinux# getsebool global_ssp
global_ssp --> on
root@cooler-desktop:/selinux# cat booleans/global_ssp
1 1root@cooler-desktop:/selinux# echo 0 > booleans/global_ssp
root@cooler-desktop:/selinux# cat booleans/global_ssp
1 0root@cooler-desktop:/selinux# echo 1 > commit_pending_bools
root@cooler-desktop:/selinux# cat booleans/global_ssp
0 0root@cooler-desktop:/selinux#
요렇게 commit에다가 1써주면 된다.



TIP

정책 빨리 찾기

find.te에다가 찾을 정책을 넣고 공백이랑 ==== xxxx ===를 지운다.
그리고 뒤에 붙는 permission부분 {}을 지우고 다음을 실행...


cat find.te | while read line; do grep -Risn "$line" * ; done

selinux 009

정말 잘 정리된 웹 문서이다. 혼자 보기 출처랑 캡쳐.
해당 사이트에 들어가면 읽을만한 자료들이 더 있다.

[[selinux]]

개요

참고 문서 : http://www.superuser.co.kr/home/lecture/?leccode=10637
http://www.superuser.co.kr/home/lecture/?leccode=10638

1. SELinux(Security-Enhanced Linux) 란?
SELinux 란 미 국가 보안국 (U.S. National Security Agency)이 오픈소스커뮤니티에 릴리즈한 Linux의 보안 강화 버전(코드 포함)으로서 리눅스 보안 모듈 구조체(Linux Security Modules(LSM) framework)를 이용하여 리눅스 커널에 의무 접근 제어(Mandatory Access Control - MAC)를 구현하는 것이다. Fedora Core3부터 기본으로 적용되기 시작하였고, 현재 대부분의 최신 리눅스 배포판에서 지원되고있다.
SELinux에 대한 이해를 돕기위해서 DAC, MAC를 잠깐 이야기 해보자.
표준 리눅스 보안은 Discretionary Access Control - DAC 모델을 따른다. DAC 모델에서, 파일과 자원에 대한 결정권은 오직 해당 객체(objects)의 사용자(user id)에게 있고 소유권(ownership)에 따라 이뤄진다. 각 사용자와 그 사용자에 의해 실행된 프로그램은 자기에게 할당된 객체에 대해 전적으로 자유재량권을 갖는다. 이러한 상황에서는, 악의 있는 일반 혹은 루트 사용자(예로, setuid와 setgid)가 실행시킨 결함이 있는 소프트웨어를 통해 주어진 객체로 원하는 어떠한 일을 해도 막아낼 방법이 없으며 보안 정책을 시스템 전체에 걸쳐 시행되도록 할 방법이 없다.
반면에 SELinux하에서 MAC는 모든 주체(subjects - 사용자, 프로그램, 프로세스)와 객체(파일, 디바이스)에 대해서 국부적으로 허가(granular permissions)해 줄 수 있다. 응용프로그램에서 불필요한 부분은 제외하고 오직 필요한 기능에 대해서만 사용 권한을 안전하게 부여하는것이 가능하다.
SELinux는 모든 주체 (사용자, 프로그램, 프로세스) 및 객체 (파일과 장치)에 각각 다른 권한을 부여할 수 있게 해줍니다. 따라서 사용자는 한 응용 프로그램에게 그 프로그램이 제대로 작동하는데 필요한 권한만 안전하게 부여할 수 있다.
2 . SELinux 정책이란 무엇인가?
SELinux 정책은 사용자, 프로그램, 프로세스 그리고 이들의 동작 대상인 파일과 디바이스를 포함한 시스템 전체, 즉, 모든 주체와 객체에 대한 접근 허가(access permissions)를 포함한 패키지를 이야기한다. 페도라에서 사용가능한 정책 패키지는 strict , targeted 두가지가 있다.
페도라코어에서 SELinux 정책으로 strict policy 를 적용함으로 인해서 다양한 사용자들이 많은 문제점을 일으킴으로 인해서(일반사용자들이 SELinux를 사용하기 위해서는 수준높은 전문기술이 필요하다) 현재 RHEL4 에서는 보다 완화된 정책패키지 targeted poicy 가 설치시 기본으로 제공된다.
targeted policy는 자주 문제시되는 부분들만 우선적으로 적용시키고, 나머지는 표준 리눅스 보안과 동일하게 운영되도록 적용한 정책이다.
현재, targeted policy 에서는 dhcpd, httpd(apache.te), named, nscd, ntpd, portmap, snmpd, squid 그리고 syslogd 데몬에 대해서 관리한다. 이 데몬들에 대한 정책 파일은 /etc/selinux/targeted/src/policy/domains/program에서 찾을 수 있다.
ReadHat Enterprise Linux 5(CentOS 5)에서는 Policy Module(Customizing SELinux Policy) 형태의 정책 변경 도구를 제공하고 있다.

ls 또는 ps 의 Z 옵션

 
 [root@ProjectS ~]#  ls -Z
 drwxr-xr-x  root root user_u:object_r:user_home_t      8_install_DokuWiki
 drwxr-xr-x  root root user_u:object_r:user_home_t      8_install_textcube
 drwxr-xr-x  root root system_u:object_r:user_home_t    8_install_trac
 drwxr-xr-x  root root system_u:object_r:file_t         9_Tbackup
 drwxr-xr-x  root root system_u:object_r:user_home_t    9_Tmount
 -rw-------  root root system_u:object_r:user_home_t    anaconda-ks.cfg
 -rw-------  root root user_u:object_r:user_home_t      dead.letter
 -rw-r--r--  root root root:object_r:user_home_t        install.log
 -rw-r--r--  root root root:object_r:user_home_t        install.log.syslog
 -rw-------  root root user_u:object_r:user_home_t      mbox
 [root@ProjectS ~]# 
 
 
 [root@ProjectS ~]#  ps -Z
 LABEL                             PID TTY          TIME CMD
 user_u:system_r:unconfined_t    13761 pts/0    00:00:00 su
 user_u:system_r:unconfined_t    13762 pts/0    00:00:00 bash
 user_u:system_r:unconfined_t    13875 pts/0    00:00:00 ps
 [root@ProjectS ~]# 
 

sestatus

setenforce

setsebool

setsebool 사용법
 
 [root@ProjectS ~]#  setsebool --help
 Usage:  setsebool [ -P ] boolean value | bool1=val1 bool2=val2...
 [root@ProjectS ~]# 
 
FTP 데몬에 대한 사용가 계정 HOME directory 접근 허용

현상 : ftp client로 login시 인증 성공 후 해당 계정 home 디렉토리로 자동 이동 중 change directory error 발생
참조 URL : http://kldp.org/node/54059
페도라 코어 4 까실때 SELinux 설정하셨나요?그렇다면 디폴트로 사용자의 home 디렉토리에 쓰기를 막아놨을겁니다.SELinux 설정에서 FTP 부분을 변경하시면 될것 같습니다.변경방법은 콘솔상에서 하는방법과 x윈도우에서 변경하는 방법이 있습니다.콘솔상에서 변경하시려면
 
 [root@ProjectS ~]#  setsebool -P ftp_home_dir 1 
 [root@ProjectS ~]#  service vsftpd restart
 
와 같이 home 디렉토리의 읽고쓰기를 1(True)로 변경하시고vsftpd를 재시작 하시면 됩니다.
x윈도우 상에서는 데스크탑 → 시스템 설정 → 보안 수준에 가셔서SELinux 텝에 들어가시면 정책 수정중에 FTP 라고 있습니다.
그곳의 삼각형을 클릭하시면 아래로 3개의 정책이 더 나오는데Ftp의 사용자 홈디렉토리 읽고/쓰기 허가 를 클릭 하시면 됩니다.
또는 FTP에 관하여 SELinux 정책을 아예 적용하지 않는 옵션을 설정하셔도 됩니다.콘솔 상에서는
 
 [root@ProjectS ~]#  setsebool -P ftpd_disable_trans 1
 
혹은 정책 수정중에 Disable SELinux protection for ftpd daemon 을 클릭 하시면 됩니다.
p.s. SELinux 설정에 보시면 다른 서비스들도 기본으로 많이 막혀 있습니다.

chcon

 
 [root@ProjectS]#  chcon --help
 Usage: chcon [OPTION]... CONTEXT FILE...
   or:  chcon [OPTION]... [-u USER] [-r ROLE] [-l RANGE] [-t TYPE] FILE...
   or:  chcon [OPTION]... --reference=RFILE FILE...
 Change the security context of each FILE to CONTEXT.
   -c, --changes          like verbose but report only when a change is made
   -h, --no-dereference   affect symbolic links instead of any referenced file
                          (available only on systems with lchown system call)
   -f, --silent, --quiet  suppress most error messages
       --reference=RFILE  use RFILE's group instead of using a CONTEXT value
   -u, --user=USER        set user USER in the target security context
   -r, --role=ROLE        set role ROLE in the target security context
   -t, --type=TYPE        set type TYPE in the target security context
   -l, --range=RANGE      set range RANGE in the target security context
   -R, --recursive        change files and directories recursively
   -v, --verbose          output a diagnostic for every file processed
       --help             display this help and exit
       --version          output version information and exit
 [root@ProjectS]# 
 
 
 [root@ProjectS]#  chcon -R -t httpd_sys_content_t box/
 [root@ProjectS]#  ls -lZ
 drwxr-xr-x  apache apache system_u:object_r:httpd_sys_content_t box
 

semanage

semanage 사용법
  • Apache의 추가 Listen port 확장
 
 [root@ProjectS conf.d]#  semanage --help
 semanage {login|user|port|interface|fcontext|translation} -l [-n]
 semanage login -{a|d|m} [-sr] login_name
 semanage user -{a|d|m} [-LrRP] selinux_name
 semanage port -{a|d|m} [-tr] [ -p protocol ] port | port_range
 semanage interface -{a|d|m} [-tr] interface_spec
 semanage fcontext -{a|d|m} [-frst] file_spec
 semanage translation -{a|d|m} [-T] level
 Primary Options:
         -a, --add        Add a OBJECT record NAME
         -d, --delete     Delete a OBJECT record NAME
         -m, --modify     Modify a OBJECT record NAME
         -l, --list       List the OBJECTS
         -h, --help       Display this message
         -n, --noheading  Do not print heading when listing OBJECTS
 Object-specific Options (see above):
         -f, --ftype      File Type of OBJECT
                 "" (all files)
                 -- (regular file)
                 -d (directory)
                 -c (character device)
                 -b (block device)
                 -s (socket)
                 -l (symbolic link)
                 -p (named pipe)
         -p, --proto      Port protocol (tcp or udp)
         -P, --prefix     Prefix for home directory labeling
         -L, --level      Default SELinux Level (MLS/MCS Systems only)
         -R, --roles      SELinux Roles (ex: "sysadm_r staff_r")
         -T, --trans      SELinux Level Translation (MLS/MCS Systems only)
         -s, --seuser     SELinux User Name
         -t, --type       SELinux Type for the object
         -r, --range      MLS/MCS Security Range (MLS/MCS Systems only)
 
 
 [root@ProjectS conf.d]#  service httpd restart
 httpd 를 정지 중:                                          [  OK  ]
 httpd (을)를 시작 중: [Sun Dec 30 18:28:12 2007] [warn] PassEnv variable LD_LIBRARY_PATH was undefined
 [Sun Dec 30 18:28:12 2007] [warn] PassEnv variable LD_LIBRARY_PATH was undefined
 httpd: Could not reliably determine the server's fully qualified domain name,
        using 218.158.45.145 for ServerName
 (13)Permission denied: make_sock: could not bind to address [::]:8888
 (13)Permission denied: make_sock: could not bind to address 0.0.0.0:8888
 no listening sockets available, shutting down
 Unable to open logs
                                                            [실패]
 
 
 [root@ProjectS conf.d]#  semanage port -a -t http_port_t -p tcp 8888
 [root@ProjectS conf.d]#  semanage port -l
 SELinux Port Type              Proto    Port Number
 http_cache_port_t              tcp      3128, 8080, 8118
 http_cache_port_t              udp      3130
 http_port_t                    tcp      8888, 80, 443, 488, 8008, 8009, 8443
 

audit2allow

  • /var/log/audit/audit.log 및 /var/log/messages, /var/log/dmesg 의 AVC denied 로그를 어떤 타입과 적절한 권한이 필요한지 번역해서 보여준다.
 
 [root@ProjectS ~]#  audit2allow --help
 usage: audit2allow [options]
 options:
   --version             show program's version number and exit
   -h, --help            show this help message and exit
   -a, --audit           read input from audit log - conflicts with -i
   -d, --dmesg           read input from dmesg - conflicts with --audit and
                         --input
   -i INPUT, --input=INPUT
                         read input from  - conflicts with -a
   -l, --lastreload      read input only after the last reload
   -r, --requires        generate require statements for rules
   -m MODULE, --module=MODULE
                         set the module name - implies --requires
   -M MODULE_PACKAGE, --module-package=MODULE_PACKAGE
                         generate a module package - conflicts with -o and -m
   -o OUTPUT, --output=OUTPUT
                         append output to , conflicts with -M
   -R, --reference       generate refpolicy style output
   -v, --verbose         explain generated output
   -e, --explain         fully explain generated output
   -t TYPE, --type=TYPE  only process messages with a type that matches this
                         regex
   --perm-map=PERM_MAP   file name of perm map
   --interface-info=INTERFACE_INFO
                         file name of interface information
   --debug               leave generated modules for -M
 [root@ProjectS ~]# 
 [root@ProjectS ~]#  audit2allow -a
 # ============= ftpd_t ==============
 allow ftpd_t home_root_t:dir search;
 # ============= httpd_sys_script_t ==============
 allow httpd_sys_script_t file_t:dir { search getattr };
 allow httpd_sys_script_t file_t:file { read getattr };
 allow httpd_sys_script_t user_home_t:dir { search getattr };
 allow httpd_sys_script_t user_home_t:file { read getattr };
 # ============= httpd_t ==============
 allow httpd_t port_t:tcp_socket name_bind;
 allow httpd_t self:tcp_socket name_bind;
 allow httpd_t user_home_t:dir { read search getattr };
 allow httpd_t user_home_t:file { read write getattr };
 # ============= system_mail_t ==============
 allow system_mail_t httpd_t:file read;
 # ============= unconfined_t ==============
 allow unconfined_t httpd_sys_script_t:dir relabelto;
 allow unconfined_t httpd_sys_script_t:file relabelto;
 [root@ProjectS ~]# 
 
  • /var/log/audit/audit.log를 직접 보면 다음과 같다.(빨간색 부분을 주목하자.)
실예 : /home/svn/publicsvn/test2/format의 Open permission denied(-13) 발생에 대한 /var/log/audit/audit.log 분석
type=AVC msg=audit(1199086710.853:174): avc: denied { search } for pid=4166 comm="trac.cgi" name="/" dev=hdc1 ino=2 scontext=user_u:system_r:httpd_sys_script_t:s0 tcontext=system_u:object_r:file_t:s0 tclass=dir
type=SYSCALL msg=audit(1199086710.853:174): arch=40000003 syscall=196 success=no exit=-13 a0=9a58438 a1=bfd0043c a2=6fcff4 a3=8171 items=0 ppid=4108 pid=4166 auid=500 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) comm="trac.cgi" exe="/usr/bin/python" subj=user_u:system_r:httpd_sys_script_t:s0 key=(null)
  • 대충 해석하면 /usr/bin/python 프로세스에 의한 명령 trac.cgi가 user_u:system_r:httpd_sys_script_t CONTEXT를 가지고 대상인 system_u:object_r:file_t CONTEXT를 갖는 dir ”/” (실예에서 이것은 /home/svn을 지칭하는 것이었다. ^^; 뭘 기준으로 한것인지 모르니 이거 사람잡을만 하다)에 접근하다가 avc의 search 권한 불일치로 거부당하여 값 -13 에러를 리턴하고 실패했다는 내용이다.
  • 따라서 이에대한 해결책으로 /home/svn에 httpd_sys_script_t 의 읽기,쓰기 권한에 부합하는 httpd_sys_script_rw_t 를 부여함으로서 바로 위 에러에 대한 문제 해결이 가능하다.(전체 문제 해결을 위해서는 svn부터 시작하여 /home/svn/publicsvn/test2/format 까지 전 경로에 거처 httpd_sys_script_rw_t를 부여하여야 한다)
  • 다음은 실예에서 문제되었던 것을 해결하기 위한 일련의 과정이다.
 
 [root@ProjectS /]#  cd home
 [root@ProjectS home]#  ls -lZ
 drwxr-xr-x  root     root     system_u:object_r:file_t         svn
 [root@ProjectS home]#  vi /var/log/audit/audit.log
 
type=AVC msg=audit(1199086710.853:174): avc: denied { search } for pid=4166 comm="trac.cgi" name="/" dev=hdc1 ino=2 scontext=user_u:system_r:httpd_sys_script_t:s0 tcontext=system_u:object_r:file_t:s0 tclass=dir
type=SYSCALL msg=audit(1199086710.853:174): arch=40000003 syscall=196 success=no exit=-13 a0=9a58438 a1=bfd0043c a2=6fcff4 a3=8171 items=0 ppid=4108 pid=4166 auid=500 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) comm="trac.cgi" exe="/usr/bin/python" subj=user_u:system_r:httpd_sys_script_t:s0 key=(null)
 
 [root@ProjectS home]#  chcon -t httpd_sys_script_rw_t svn
 [root@ProjectS home]#  ls -lZ
 drwxr-xr-x  root     root     system_u:object_r:httpd_sys_script_rw_t svn
 [root@ProjectS home]#  vi /var/log/audit/audit.log
 
type=AVC msg=audit(1199086844.720:178): avc: denied { search } for pid=4184 comm="trac.cgi" name="publicsvn" dev=hdc1 ino=9535489 scontext=user_u:system_r:httpd_sys_script_t:s0 tcontext=user_u:object_r:file_t:s0 tclass=dir
type=SYSCALL msg=audit(1199086844.720:178): arch=40000003 syscall=5 success=no exit=-13 a0=85f2618 a1=8000 a2=1b6 a3=8000 items=0 ppid=4119 pid=4184 auid=500 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) comm="trac.cgi" exe="/usr/bin/python" subj=user_u:system_r:httpd_sys_script_t:s0 key=(null)
 
 [root@ProjectS home]#  cd svn
 [root@ProjectS svn]#  ls -lZ
 -rwxr-xr-x  root     root     user_u:object_r:file_t           publicsvn
 [root@ProjectS svn]#  chcon -t httpd_sys_script_rw_t publicsvn
 [root@ProjectS svn]#  ls -lZ
 drwxr-xr-x  root     root     user_u:object_r:httpd_sys_script_rw_t publicsvn
 [root@ProjectS svn]#  vi /var/log/audit/audit.log
 
type=AVC msg=audit(1199086912.148:180): avc: denied { search } for pid=4199 comm="trac.cgi" name="test2" dev=hdc1 ino=9535515 scontext=user_u:system_r:httpd_sys_script_t:s0 tcontext=user_u:object_r:file_t:s0 tclass=dir
type=SYSCALL msg=audit(1199086912.148:180): arch=40000003 syscall=5 success=no exit=-13 a0=90fb618 a1=8000 a2=1b6 a3=8000 items=0 ppid=4110 pid=4199 auid=500 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) comm="trac.cgi" exe="/usr/bin/python" subj=user_u:system_r:httpd_sys_script_t:s0 key=(null)
 
 [root@ProjectS svn]#  cd publicsvn/
 [root@ProjectS publicsvn]#  ls -lZ
 drwxrwxr-x  root     root     user_u:object_r:file_t           test2
 [root@ProjectS publicsvn]#  chcon -t httpd_sys_script_rw_t test2
 [root@ProjectS publicsvn]#  cd test2
 [root@ProjectS test2]#  chcon -t httpd_sys_script_rw_t format
 [root@ProjectS test2]#  ls -lZ
 -r--rw-r--  root     root     user_u:object_r:httpd_sys_script_rw_t format
 

audit2why

 
 [root@ProjectS ~]#  audit2why --help
 audit2why: invalid option -- -
 usage:  audit2why [-p policy] < /var/log/audit/audit.log
 

semodule

 
 [root@ProjectS audit]#  semodule --help
 usage:  semodule [options]... MODE [MODES]...
 Manage SELinux policy modules.
 MODES:
   -R, --reload              reload policy
   -B, --build               build and reload policy
   -i,--install=MODULE_PKG   install a new module
   -u,--upgrade=MODULE_PKG   upgrade existing module
   -b,--base=MODULE_PKG      install new base module
   -r,--remove=MODULE_NAME   remove existing module
   -l,--list-modules         display list of installed modules
 Other options:
   -s,--store       name of the store to operate on
   -n,--noreload    do not reload policy after commit
   -h,--help        print this message and quit
   -v,--verbose     be verbose
 [root@ProjectS audit]#  semodule -l
 amavis  1.1.0
 ccs     1.0.0
 clamav  1.1.0
 dcc     1.1.0
 evolution       1.1.0
 iscsid  1.0.0
 mozilla 1.1.0
 mplayer 1.1.0
 nagios  1.1.0
 oddjob  1.0.1
 pcscd   1.0.0
 pyzor   1.1.0
 razor   1.1.0
 ricci   1.0.0
 smartmon        1.1.0
 [root@ProjectS audit]# 
 

Customizing SELinux Policy

웁스! 한고비 뒤 SELinux와 관련된 에러가 또 발생하였다. Trac에서 로깅을 위해 syslogd를 사용하도록 설정하였더니, 웁스 아래 그림과 같은 에러가 발생하였다.
원인은 기본적으로 httpd 데몬에서 수행된 script (httpd_sys_script_t)에서 Socket 생성하는 것이 막혀 있기 때문이었다. ( ^^; 재미있는 것은 php는 스크립트로 취급되지 않는 것 같다. php로 된 Dokuwiki는 smtp를 사용한 메일 발송에 문제가 없었었다.)

이것은 socket이라는 시스템의 커널 리소스에 대한 문제이기 때문에 무언가 context type을 변경해준다고 해결될 문제가 아니었다. 즉 정책 변경이 필요하게 된 것이다.
그동만 별 영양가 없다고 생각했던 audit2allow가 드디어 빛을 발하기 시작했다.
참고문서 : Chapter 45. Customizing SELinux Policy
SELinux Policy를 커스터마이징 하는데 있어 Red Hat Enterprise Linux 4, 5에 각각 대응하는 CentOS 4, 5의 정책 Customizing 방법이 큰 차이가 있었다.
CentOS 4는 selinux-policy-targeted-sources 패키지를 설치하여 정책 파일들을 편집한 다음 다시 로드 하는 방식을 사용한다.
그러나 CentOS 5에서는 정책관리를 보다 커널 모듈과 같이 취급하여 Policy Module이라는 것을 사용하였다.모듈의 install, reload, remove 등에 사용되는 명령이 semodule 이라는 것이다.
다시 위의 에러가 발생한 문제로 돌아가 문제가 발행한 프로그램은 trac.cgi라는 것이다. /var/log/audit/audit.log 의 AVC 로그중 comm=“trac.cgi” 와 관련된 AVC를 뽑고자 한다면 다음과 같이 할 수 있다.
 
 #  grep trac.cgi /var/log/audit/audit.log | audit2allow
 
그동안 문제되었던 다른것 포함, audit 로그를 분석하여 그것을 allow 정책으로 변환하여 보여준다.
 
 [root@ProjectS policy]#  grep trac.cgi /var/log/audit/audit.log | audit2allow
 # ============= httpd_sys_script_t ==============
 allow httpd_sys_script_t devlog_t:sock_file write;
 allow httpd_sys_script_t file_t:dir { search getattr };
 allow httpd_sys_script_t file_t:file { read getattr };
 allow httpd_sys_script_t self:unix_dgram_socket { write create connect };
 allow httpd_sys_script_t syslogd_t:unix_dgram_socket sendto;
 allow httpd_sys_script_t user_home_t:dir { search getattr };
 allow httpd_sys_script_t user_home_t:file { read getattr };
 # ============= unconfined_t ==============
 allow unconfined_t httpd_sys_script_t:file relabelto;
 
1차적으로 allow httpd_sys_script_t self:unix_dgram_socket { write create connect }; 이 적용되면 일차적으로 위 소켓 생성시 나는 에러를 해결할 수 있을 것이다. 기타 관련된 다른 allow도 audit 로그 분석을 통해 뽑아졌다.
이를 Policy Module로 컴파일하여 만드는 방법은 다음과 같다.
 
 #  grep trac.cgi /var/log/audit/audit.log | audit2allow -M tracsocket
 
위 명령을 수행하면 현재 폴더에 tracsocket.pp 와 tracsocket.te 파일 2개가 생성된다.tracsocket.pp는 컴파일된 policy module 파일이다.tracsocket.te는 text로 된 컴파일되기 전의 소스이다.
이것을 SELinux 시스템에 적용하는 방법은
 
 #  semodule -i tracsocket.pp
 
와 같이 하면 적용된다.
이렇게 한번 인스톨된 모듈의 정책은 리부팅 후에도 유지된다고 하니, install에 사용된 pp를 삭제하면 무슨일이 벌어질까?!, 아마도 커널에 로드된 정책을 포함한 전체 Policy를 별도로 저장한다면 문제가 없겠지만 커널 모듈 파일이 지워지면 커널 모듈 로딩중 에러가 나듯, pp 파일이 삭제되면 SELinux에서 Policy 모듈 로드중 에러가 나지 않을까 생각해 본다.
굳이 시간을 들여 테스트 해보픈 마음은 없다. ^^; 여튼 사용된 pp파일은 되도록 삭제나 install된 위치에서 옮기지 말도록 하자. te 파일도 같이 보관하자. 컴파일된 pp 모듈이 실제 어떤 정책을 갖는지 텍스트인 te 파일을 통해 확인할 수 있으니 말이다. 얼핏 te를 가지고 재 컴파일도 가능하다고 한것 같지만 사용법은 나중에 필요하면 알아봐야 겠다. ㅋㅋ

관련 주제들

bootcamp 지우기

맥북 프로 레티나 터치바 diskutility 에서 bootcamp 파티션 삭제하면 검은색에서 회색으로 바뀐다(APFS로 지정) 파틴션 아이콘 클릭하여 - 버튼을 이용하여 삭제하면 끝.