Thanks Hiroki, I have added the fix versions, ’ll fix it asap.

-Harikrishna

On 09-Jun-2014, at 2:35 pm, Hiroki Ohashi <hiroki.s...@gmail.com> wrote:

> Hi Harikrishna
> 
> Thank you very much for your reproduction work.
> I created a ticket for this issue.
> 
>    https://issues.apache.org/jira/browse/CLOUDSTACK-6869
> 
> Please confirm it.
> 
> 
> Best Regards
> 
> 2014-06-09 15:59 GMT+09:00 Harikrishna Patnala 
> <harikrishna.patn...@citrix.com>:
>> Hi Hiroki,
>> 
>> We should not override the ssh key pair provided in the deployVM API with 
>> the ssh key in template metadata.
>> I just able to reproduce this. Please create a ticket for this issue.
>> 
>> Thanks
>> Harikrishna
>> 
>> On 06-Jun-2014, at 5:18 pm, Hiroki Ohashi <hiroki.s...@gmail.com> wrote:
>> 
>>> Dear guys
>>> 
>>> I encountered a problem that a ssh public key of ssh_keypairs for a
>>> newly created instance is overridden by another ssh key in template
>>> meta data. I think this leads to security vulnerability because a
>>> template owner can login to other user's instance created from the
>>> template. So, could you fix this issue?
>>> 
>>> This behavior is caused by meta data import at commitUserVm method. A
>>> ssh key value specified by an instance owner is set to a UserVmVO
>>> object at line 2986-2988 of
>>> server/src/com/cloud/vm/UserVmManagerImpl.java in 4.3 branch [1], but
>>> this value is overridden at line 3035-3038 by template meta data.
>>> 
>>> Please note a database contains meta data entries related to a
>>> template which you created from an instance in cloud.template_view
>>> like [2]. 2nd row has detail_name and detail_value about ssh key and
>>> CloudStack override the user specified ssh key value by the owner's
>>> detail value in this situation. It results in delivery of the template
>>> owner's ssh key for the instance created from the template to virtual
>>> router inspite of specification of instance owner's ssh key.
>>> 
>>> You can reproduce this phenomenon like below.
>>> 
>>>   1. Deploy an instance with a ssh key A by specifying 'keypair'
>>>      value.
>>>   2. Create a template from this instance.
>>>   3. Deploy an instance with another ssh key B by specifying
>>>      'keypair' value.
>>> 
>>> 
>>> [1] server/src/com/cloud/vm/UserVmManagerImpl.java
>>> 
>>>  2971     private UserVmVO commitUserVm(final DataCenter zone, final
>>> VirtualMachineTemplate template, final String hostName, final String
>>> displayName, final Account owner,
>>>  2972         final Long diskOfferingId, final Long diskSize, final
>>> String userData, final HypervisorType hypervisor, final Account
>>> caller, final Boolean isDisplayVmEnabled,
>>>  2973         final String keyboard, final long accountId, final
>>> ServiceOfferingVO offering, final boolean isIso, final String
>>> sshPublicKey,
>>>  2974         final LinkedHashMap<String, NicProfile> networkNicMap,
>>> final long id, final String instanceName, final String uuidName, final
>>> HypervisorType hypervisorType,
>>>  2975         final Map<String, String> customParameters) throws
>>> InsufficientCapacityException {
>>>  2976         return Transaction.execute(new
>>> TransactionCallbackWithException<UserVmVO,
>>> InsufficientCapacityException>() {
>>>  2977             @Override
>>>  2978             public UserVmVO doInTransaction(TransactionStatus
>>> status) throws InsufficientCapacityException {
>>>  2979                 UserVmVO vm = new UserVmVO(id, instanceName,
>>> displayName,
>>>  2980                         template.getId(), hypervisorType,
>>> template.getGuestOSId(),
>>>  2981                         offering.getOfferHA(),
>>> offering.getLimitCpuUse(),
>>>  2982                         owner.getDomainId(), owner.getId(),
>>> offering.getId(), userData,
>>>  2983                         hostName, diskOfferingId);
>>>  2984                 vm.setUuid(uuidName);
>>>  2985
>>> vm.setDynamicallyScalable(template.isDynamicallyScalable());
>>>  2986                 if (sshPublicKey != null) {
>>>  2987                     vm.setDetail("SSH.PublicKey", sshPublicKey);
>>>  2988                 }
>>>  2989
>>>  2990                 if (keyboard != null && !keyboard.isEmpty())
>>>  2991                     vm.setDetail(VmDetailConstants.KEYBOARD, 
>>> keyboard);
>>>  2992
>>>  2993                 if (isIso) {
>>>  2994                     vm.setIsoId(template.getId());
>>>  2995                 }
>>>  2996
>>>  2997                 if(isDisplayVmEnabled != null){
>>>  2998                     if(!_accountMgr.isRootAdmin(caller.getType())){
>>>  2999                         throw new PermissionDeniedException(
>>> "Cannot update parameter displayvm, only admin permitted ");
>>>  3000                     }
>>>  3001                     vm.setDisplayVm(isDisplayVmEnabled);
>>>  3002                 }else {
>>>  3003                     vm.setDisplayVm(true);
>>>  3004                 }
>>>  3005
>>>  3006                 // If hypervisor is vSphere, check for clone
>>> type setting.
>>>  3007                 if (hypervisorType.equals(HypervisorType.VMware)) {
>>>  3008                     // retrieve clone flag.
>>>  3009                     UserVmCloneType cloneType = 
>>> UserVmCloneType.linked;
>>>  3010                     String value =
>>> _configDao.getValue(Config.VmwareCreateFullClone.key());
>>>  3011                     if (value != null) {
>>>  3012                         if (Boolean.parseBoolean(value) == true)
>>>  3013                             cloneType = UserVmCloneType.full;
>>>  3014                     }
>>>  3015                     UserVmCloneSettingVO vmCloneSettingVO =
>>> new UserVmCloneSettingVO(id, cloneType.toString());
>>>  3016                     _vmCloneSettingDao.persist(vmCloneSettingVO);
>>>  3017                 }
>>>  3018
>>>  3019                 long guestOSId = template.getGuestOSId();
>>>  3020                 GuestOSVO guestOS = _guestOSDao.findById(guestOSId);
>>>  3021                 long guestOSCategoryId = guestOS.getCategoryId();
>>>  3022                 GuestOSCategoryVO guestOSCategory =
>>> _guestOSCategoryDao.findById(guestOSCategoryId);
>>>  3023
>>>  3024
>>>  3025                 // If hypervisor is vSphere and OS is OS X,
>>> set special settings.
>>>  3026                 if (hypervisorType.equals(HypervisorType.VMware)) {
>>>  3027                     if
>>> (guestOS.getDisplayName().toLowerCase().contains("apple mac os")){
>>>  3028                         vm.setDetail("smc.present", "TRUE");
>>>  3029
>>> vm.setDetail(VmDetailConstants.ROOK_DISK_CONTROLLER, "scsi");
>>>  3030                         vm.setDetail("firmware", "efi");
>>>  3031                         s_logger.info("guestOS is OSX :
>>> overwrite root disk controller to scsi, use smc and efi");
>>>  3032                     }
>>>  3033                 }
>>>  3034
>>>  3035                 Map<String, String> details = template.getDetails();
>>>  3036                 if ( details != null && !details.isEmpty() ) {
>>>  3037                     vm.details.putAll(details);
>>>  3038                 }
>>>  3039
>>>  3040                 _vmDao.persist(vm);
>>>  3041                 if (customParameters != null &&
>>> customParameters.size() > 0) {
>>>  3042                     for (String key : customParameters.keySet()) {
>>>  3043                         vm.setDetail(key, customParameters.get(key));
>>>  3044                     }
>>>  3045                 }
>>>  3046                 _vmDao.saveDetails(vm);
>>> 
>>> [2] database example
>>> 
>>> mysql> select * from cloud.template_view where id=207 \G;
>>> *************************** 1. row ***************************
>>>                 id: 207
>>>               uuid: c96f0d9a-0a56-4d30-af73-fe8b31ae37c3
>>>        unique_name: 2219faa5a-4e7b-3425-b6e6-135ab210422b
>>>               name: cluster_frontend-20140520.2
>>>             public: 1
>>>           featured: 0
>>>               type: USER
>>>                hvm: 1
>>>               bits: 64
>>>                url: NULL
>>>             format: QCOW2
>>>            created: 2014-05-20 09:33:47
>>>           checksum: NULL
>>>       display_text: Cluster Frontend VM CentOS 6.5 ver.20140520.2
>>>    enable_password: 1
>>> dynamically_scalable: 0
>>>     template_state: Active
>>>        guest_os_id: 182
>>>      guest_os_uuid: 9d3c42d8-caab-11e3-9125-001e679910a0
>>>      guest_os_name: CentOS 6.4 (64-bit)
>>>           bootable: 1
>>>        prepopulate: 0
>>>        cross_zones: 0
>>>    hypervisor_type: KVM
>>>        extractable: 0
>>>       template_tag: NULL
>>>           sort_key: 0
>>>            removed: NULL
>>>      enable_sshkey: 0
>>> source_template_id: 205
>>> source_template_uuid: c131680c-3e0e-4d7c-b554-02dabc10ade1
>>>         account_id: 3
>>>       account_uuid: f9e4e1ca-69fd-4ae3-b70c-15bbcc13406e
>>>       account_name: sgcadm
>>>       account_type: 0
>>>          domain_id: 2
>>>        domain_uuid: 84dd635d-fb99-4895-b199-7d777aa144d5
>>>        domain_name: default
>>>        domain_path: /default/
>>>         project_id: NULL
>>>       project_uuid: NULL
>>>       project_name: NULL
>>>     data_center_id: NULL
>>>   data_center_uuid: NULL
>>>   data_center_name: NULL
>>>      lp_account_id: NULL
>>>           store_id: 3
>>>        store_scope: REGION
>>>              state: Ready
>>>     download_state: DOWNLOADED
>>>       download_pct: 100
>>>          error_str: NULL
>>>               size: 18465816576
>>>          destroyed: 0
>>>   created_on_store: 2014-05-20 09:33:47
>>>        detail_name: Message.ReservedCapacityFreed.Flag
>>>       detail_value: false
>>>             tag_id: NULL
>>>           tag_uuid: NULL
>>>            tag_key: NULL
>>>          tag_value: NULL
>>>      tag_domain_id: NULL
>>>     tag_account_id: NULL
>>>    tag_resource_id: NULL
>>>  tag_resource_uuid: NULL
>>>  tag_resource_type: NULL
>>>       tag_customer: NULL
>>>     temp_zone_pair: 207_0
>>> *************************** 2. row ***************************
>>>                 id: 207
>>>               uuid: c96f0d9a-0a56-4d30-af73-fe8b31ae37c3
>>>        unique_name: 2219faa5a-4e7b-3425-b6e6-135ab210422b
>>>               name: cluster_frontend-20140520.2
>>>             public: 1
>>>           featured: 0
>>>               type: USER
>>>                hvm: 1
>>>               bits: 64
>>>                url: NULL
>>>             format: QCOW2
>>>            created: 2014-05-20 09:33:47
>>>           checksum: NULL
>>>       display_text: Cluster Frontend VM CentOS 6.5 ver.20140520.2
>>>    enable_password: 1
>>> dynamically_scalable: 0
>>>     template_state: Active
>>>        guest_os_id: 182
>>>      guest_os_uuid: 9d3c42d8-caab-11e3-9125-001e679910a0
>>>      guest_os_name: CentOS 6.4 (64-bit)
>>>           bootable: 1
>>>        prepopulate: 0
>>>        cross_zones: 0
>>>    hypervisor_type: KVM
>>>        extractable: 0
>>>       template_tag: NULL
>>>           sort_key: 0
>>>            removed: NULL
>>>      enable_sshkey: 0
>>> source_template_id: 205
>>> source_template_uuid: c131680c-3e0e-4d7c-b554-02dabc10ade1
>>>         account_id: 3
>>>       account_uuid: f9e4e1ca-69fd-4ae3-b70c-15bbcc13406e
>>>       account_name: sgcadm
>>>       account_type: 0
>>>          domain_id: 2
>>>        domain_uuid: 84dd635d-fb99-4895-b199-7d777aa144d5
>>>        domain_name: default
>>>        domain_path: /default/
>>>         project_id: NULL
>>>       project_uuid: NULL
>>>       project_name: NULL
>>>     data_center_id: NULL
>>>   data_center_uuid: NULL
>>>   data_center_name: NULL
>>>      lp_account_id: NULL
>>>           store_id: 3
>>>        store_scope: REGION
>>>              state: Ready
>>>     download_state: DOWNLOADED
>>>       download_pct: 100
>>>          error_str: NULL
>>>               size: 18465816576
>>>          destroyed: 0
>>>   created_on_store: 2014-05-20 09:33:47
>>>        detail_name: SSH.PublicKey
>>>       detail_value: ssh-rsa ...(snip)
>>>             tag_id: NULL
>>>           tag_uuid: NULL
>>>            tag_key: NULL
>>>          tag_value: NULL
>>>      tag_domain_id: NULL
>>>     tag_account_id: NULL
>>>    tag_resource_id: NULL
>>>  tag_resource_uuid: NULL
>>>  tag_resource_type: NULL
>>>       tag_customer: NULL
>>>     temp_zone_pair: 207_0
>>> *************************** 3. row ***************************
>>>                 id: 207
>>>               uuid: c96f0d9a-0a56-4d30-af73-fe8b31ae37c3
>>>        unique_name: 2219faa5a-4e7b-3425-b6e6-135ab210422b
>>>               name: cluster_frontend-20140520.2
>>>             public: 1
>>>           featured: 0
>>>               type: USER
>>>                hvm: 1
>>>               bits: 64
>>>                url: NULL
>>>             format: QCOW2
>>>            created: 2014-05-20 09:33:47
>>>           checksum: NULL
>>>       display_text: Cluster Frontend VM CentOS 6.5 ver.20140520.2
>>>    enable_password: 1
>>> dynamically_scalable: 0
>>>     template_state: Active
>>>        guest_os_id: 182
>>>      guest_os_uuid: 9d3c42d8-caab-11e3-9125-001e679910a0
>>>      guest_os_name: CentOS 6.4 (64-bit)
>>>           bootable: 1
>>>        prepopulate: 0
>>>        cross_zones: 0
>>>    hypervisor_type: KVM
>>>        extractable: 0
>>>       template_tag: NULL
>>>           sort_key: 0
>>>            removed: NULL
>>>      enable_sshkey: 0
>>> source_template_id: 205
>>> source_template_uuid: c131680c-3e0e-4d7c-b554-02dabc10ade1
>>>         account_id: 3
>>>       account_uuid: f9e4e1ca-69fd-4ae3-b70c-15bbcc13406e
>>>       account_name: sgcadm
>>>       account_type: 0
>>>          domain_id: 2
>>>        domain_uuid: 84dd635d-fb99-4895-b199-7d777aa144d5
>>>        domain_name: default
>>>        domain_path: /default/
>>>         project_id: NULL
>>>       project_uuid: NULL
>>>       project_name: NULL
>>>     data_center_id: NULL
>>>   data_center_uuid: NULL
>>>   data_center_name: NULL
>>>      lp_account_id: NULL
>>>           store_id: 3
>>>        store_scope: REGION
>>>              state: Ready
>>>     download_state: DOWNLOADED
>>>       download_pct: 100
>>>          error_str: NULL
>>>               size: 18465816576
>>>          destroyed: 0
>>>   created_on_store: 2014-05-20 09:33:47
>>>        detail_name: Encrypted.Password
>>>       detail_value: ...(snip)
>>>             tag_id: NULL
>>>           tag_uuid: NULL
>>>            tag_key: NULL
>>>          tag_value: NULL
>>>      tag_domain_id: NULL
>>>     tag_account_id: NULL
>>>    tag_resource_id: NULL
>>>  tag_resource_uuid: NULL
>>>  tag_resource_type: NULL
>>>       tag_customer: NULL
>>>     temp_zone_pair: 207_0
>>> 3 rows in set (0.00 sec)
>>> 
>>> ERROR:
>>> No query specified
>>> 
>>> mysql>
>>> 
>>> 
>>> Best Regards
>>> 
>>> --
>>> Hiroki Ohashi
>> 
> 
> 
> -- 
> Hiroki Ohashi

Reply via email to